diff options
Diffstat (limited to 'src/armnnSerializer')
-rw-r--r-- | src/armnnSerializer/ArmnnSchema.fbs | 15 | ||||
-rw-r--r-- | src/armnnSerializer/Serializer.cpp | 23 | ||||
-rw-r--r-- | src/armnnSerializer/Serializer.hpp | 4 | ||||
-rw-r--r-- | src/armnnSerializer/SerializerSupport.md | 3 | ||||
-rw-r--r-- | src/armnnSerializer/test/SerializerTests.cpp | 41 |
5 files changed, 83 insertions, 3 deletions
diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs index cde0087d6f..552c2cc056 100644 --- a/src/armnnSerializer/ArmnnSchema.fbs +++ b/src/armnnSerializer/ArmnnSchema.fbs @@ -100,7 +100,8 @@ enum LayerType : uint { Minimum = 16, Equal = 17, Maximum = 18, - Normalization = 19 + Normalization = 19, + Pad = 20 } // Base layer table to be used as part of other layers @@ -324,6 +325,15 @@ table NormalizationDescriptor { dataLayout:DataLayout = NCHW; } +table PadLayer { + base:LayerBase; + descriptor:PadDescriptor; +} + +table PadDescriptor { + padList:[uint]; +} + union Layer { ActivationLayer, AdditionLayer, @@ -344,7 +354,8 @@ union Layer { MinimumLayer, EqualLayer, MaximumLayer, - NormalizationLayer + NormalizationLayer, + PadLayer } table AnyLayer { diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp index 2000726526..868a36d42e 100644 --- a/src/armnnSerializer/Serializer.cpp +++ b/src/armnnSerializer/Serializer.cpp @@ -306,6 +306,29 @@ void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* CreateAnyLayer(flatBufferMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer); } +void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer, + const armnn::PadDescriptor& padDescriptor, + const char* name) +{ + auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad); + + std::vector<unsigned int> padList; + for (auto& p: padDescriptor.m_PadList) + { + padList.push_back(p.first); + padList.push_back(p.second); + } + + auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder, + m_flatBufferBuilder.CreateVector(padList)); + + auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder, + flatBufferBaseLayer, + flatBufferPadDesc); + + CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer); +} + void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer, const armnn::PermuteDescriptor& permuteDescriptor, const char* name) diff --git a/src/armnnSerializer/Serializer.hpp b/src/armnnSerializer/Serializer.hpp index 7e6097c465..ef56c25f2c 100644 --- a/src/armnnSerializer/Serializer.hpp +++ b/src/armnnSerializer/Serializer.hpp @@ -98,6 +98,10 @@ public: armnn::LayerBindingId id, const char* name = nullptr) override; + void VisitPadLayer(const armnn::IConnectableLayer* layer, + const armnn::PadDescriptor& PadDescriptor, + const char* name = nullptr) override; + void VisitPermuteLayer(const armnn::IConnectableLayer* layer, const armnn::PermuteDescriptor& PermuteDescriptor, const char* name = nullptr) override; diff --git a/src/armnnSerializer/SerializerSupport.md b/src/armnnSerializer/SerializerSupport.md index d018a35c3a..a77e8860a2 100644 --- a/src/armnnSerializer/SerializerSupport.md +++ b/src/armnnSerializer/SerializerSupport.md @@ -19,10 +19,11 @@ The Arm NN SDK Serializer currently supports the following layers: * Minimum * Multiplication * Normalization +* Pad * Permute * Pooling2d * Reshape * Softmax * SpaceToBatchNd -More machine learning layers will be supported in future releases.
\ No newline at end of file +More machine learning layers will be supported in future releases. diff --git a/src/armnnSerializer/test/SerializerTests.cpp b/src/armnnSerializer/test/SerializerTests.cpp index 271b3e71bd..110bf0c581 100644 --- a/src/armnnSerializer/test/SerializerTests.cpp +++ b/src/armnnSerializer/test/SerializerTests.cpp @@ -980,4 +980,45 @@ BOOST_AUTO_TEST_CASE(SerializeDeserializeEqual) {outputTensorInfo.GetShape()}, {0, 1}); } + +BOOST_AUTO_TEST_CASE(SerializeDeserializePad) +{ + class VerifyPadName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy> + { + public: + void VisitPadLayer(const armnn::IConnectableLayer*, + const armnn::PadDescriptor& descriptor, + const char* name) override + { + BOOST_TEST(name == "PadLayer"); + } + }; + + armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}}); + + const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32); + const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32); + + armnn::INetworkPtr network = armnn::INetwork::Create(); + armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0); + armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, "PadLayer"); + armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0); + + inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0)); + inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo); + padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo); + + armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network)); + BOOST_CHECK(deserializedNetwork); + + VerifyPadName nameChecker; + deserializedNetwork->Accept(nameChecker); + + CheckDeserializedNetworkAgainstOriginal(*network, + *deserializedNetwork, + {inputTensorInfo.GetShape()}, + {outputTensorInfo.GetShape()}); +} + BOOST_AUTO_TEST_SUITE_END() |