diff options
author | josh minor <josh.minor@arm.com> | 2020-01-06 16:40:46 -0600 |
---|---|---|
committer | Derek Lamberti <derek.lamberti@arm.com> | 2020-01-23 14:29:14 +0000 |
commit | 4a3c61091037e7e86e8b03bb060d8c1ab82731a9 (patch) | |
tree | 928644023400ad5ac0c26b33dfff2f975567d6e8 /src/armnnSerializer | |
parent | 190a39a4a9598e42b636ae4ab843761884148160 (diff) | |
download | armnn-4a3c61091037e7e86e8b03bb060d8c1ab82731a9.tar.gz |
IVGCVSW-4259 Add frontend and reference workload for UnaryOperationLayer
* Added new layer named ElementwiseUnary
* Deprecated existing Abs/Rsqrt layer functions
* Updated existing Abs/Rsqrt test infrastructure to use new layer
* Added boilerplate for new Exp,Neg,Sqrt elemwise op layers
* AbsQuantize test removed pending future commit
* Serialization support added
!android-nn-driver:2550
Change-Id: Ic595c645925e17b45db568187fd05646daf2e87f
Signed-off-by: josh minor <josh.minor@arm.com>
Diffstat (limited to 'src/armnnSerializer')
-rw-r--r-- | src/armnnSerializer/ArmnnSchema.fbs | 25 | ||||
-rw-r--r-- | src/armnnSerializer/Serializer.cpp | 15 | ||||
-rw-r--r-- | src/armnnSerializer/Serializer.hpp | 6 | ||||
-rw-r--r-- | src/armnnSerializer/SerializerSupport.md | 7 | ||||
-rw-r--r-- | src/armnnSerializer/SerializerUtils.cpp | 19 | ||||
-rw-r--r-- | src/armnnSerializer/SerializerUtils.hpp | 2 | ||||
-rw-r--r-- | src/armnnSerializer/test/SerializerTests.cpp | 51 |
7 files changed, 70 insertions, 55 deletions
diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs index 0d30d96452..0f8a816093 100644 --- a/src/armnnSerializer/ArmnnSchema.fbs +++ b/src/armnnSerializer/ArmnnSchema.fbs @@ -147,7 +147,8 @@ enum LayerType : uint { InstanceNormalization = 50, LogSoftmax = 51, Comparison = 52, - StandIn = 53 + StandIn = 53, + ElementwiseUnary = 54 } // Base layer table to be used as part of other layers @@ -166,6 +167,7 @@ table BindableLayerBase { // Table for each layer defined below +/// @deprecated Use ElementwiseUnaryLayer instead table AbsLayer { base:LayerBase; } @@ -252,6 +254,23 @@ table DivisionLayer { base:LayerBase; } +enum UnaryOperation : byte { + Abs = 0, + Rsqrt = 1, + Sqrt = 2, + Exp = 3, + Neg = 4 +} + +table ElementwiseUnaryDescriptor { + operation:UnaryOperation; +} + +table ElementwiseUnaryLayer { + base:LayerBase; + descriptor:ElementwiseUnaryDescriptor; +} + /// @deprecated Use ComparisonLayer instead table EqualLayer { base:LayerBase; @@ -502,6 +521,7 @@ table PadDescriptor { padValue:float = 0; } +/// @deprecated Use ElementwiseUnaryLayer instead table RsqrtLayer { base:LayerBase; } @@ -798,7 +818,8 @@ union Layer { InstanceNormalizationLayer, LogSoftmaxLayer, ComparisonLayer, - StandInLayer + StandInLayer, + ElementwiseUnaryLayer } table AnyLayer { diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp index 91b62413d8..13ea0f04a9 100644 --- a/src/armnnSerializer/Serializer.cpp +++ b/src/armnnSerializer/Serializer.cpp @@ -439,6 +439,21 @@ void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer); } +void SerializerVisitor::VisitElementwiseUnaryLayer(const armnn::IConnectableLayer* layer, + const armnn::ElementwiseUnaryDescriptor& descriptor, + const char* name) +{ + boost::ignore_unused(name); + + auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary); + auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor( + m_flatBufferBuilder, + GetFlatBufferUnaryOperation(descriptor.m_Operation)); + + auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor); + CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer); +} + void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name) { boost::ignore_unused(name); diff --git a/src/armnnSerializer/Serializer.hpp b/src/armnnSerializer/Serializer.hpp index 7dfd534081..d92c93d46c 100644 --- a/src/armnnSerializer/Serializer.hpp +++ b/src/armnnSerializer/Serializer.hpp @@ -44,6 +44,7 @@ public: return m_serializedLayers; } + ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead") void VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; @@ -109,6 +110,10 @@ public: void VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; + void VisitElementwiseUnaryLayer(const armnn::IConnectableLayer* layer, + const armnn::ElementwiseUnaryDescriptor& descriptor, + const char* name = nullptr) override; + ARMNN_DEPRECATED_MSG("Use VisitComparisonLayer instead") void VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; @@ -210,6 +215,7 @@ public: const armnn::ResizeBilinearDescriptor& resizeDescriptor, const char* name = nullptr) override; + ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead") void VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; diff --git a/src/armnnSerializer/SerializerSupport.md b/src/armnnSerializer/SerializerSupport.md index 4fc880a856..2f77a8e778 100644 --- a/src/armnnSerializer/SerializerSupport.md +++ b/src/armnnSerializer/SerializerSupport.md @@ -6,12 +6,12 @@ This reference guide provides a list of layers which can be serialized currently The Arm NN SDK Serializer currently supports the following layers: -* Abs * Activation * Addition * ArgMinMax * BatchToSpaceNd * BatchNormalization +* Comparison * Concat * Constant * Convolution2d @@ -20,6 +20,7 @@ The Arm NN SDK Serializer currently supports the following layers: * Dequantize * DetectionPostProcess * Division +* ElementwiseUnary * Floor * FullyConnected * Gather @@ -43,7 +44,6 @@ The Arm NN SDK Serializer currently supports the following layers: * QuantizedLstm * Reshape * Resize -* Rsqrt * Slice * Softmax * SpaceToBatchNd @@ -66,3 +66,6 @@ Some layers have been deprecated and replaced by others layers. In order to main * Merger will deserialize as Concat * Greater will deserialize as Comparison * ResizeBilinear will deserialize as Resize +* Abs will deserialize as ElementwiseUnary +* Rsqrt will deserialize as ElementwiseUnary + diff --git a/src/armnnSerializer/SerializerUtils.cpp b/src/armnnSerializer/SerializerUtils.cpp index df1ef285de..02a5ed3872 100644 --- a/src/armnnSerializer/SerializerUtils.cpp +++ b/src/armnnSerializer/SerializerUtils.cpp @@ -79,6 +79,25 @@ armnnSerializer::DataLayout GetFlatBufferDataLayout(armnn::DataLayout dataLayout } } +armnnSerializer::UnaryOperation GetFlatBufferUnaryOperation(armnn::UnaryOperation comparisonOperation) +{ + switch (comparisonOperation) + { + case armnn::UnaryOperation::Abs: + return armnnSerializer::UnaryOperation::UnaryOperation_Abs; + case armnn::UnaryOperation::Rsqrt: + return armnnSerializer::UnaryOperation::UnaryOperation_Rsqrt; + case armnn::UnaryOperation::Sqrt: + return armnnSerializer::UnaryOperation::UnaryOperation_Sqrt; + case armnn::UnaryOperation::Exp: + return armnnSerializer::UnaryOperation::UnaryOperation_Exp; + case armnn::UnaryOperation::Neg: + return armnnSerializer::UnaryOperation::UnaryOperation_Neg; + default: + throw armnn::InvalidArgumentException("Unary operation unknown"); + } +} + armnnSerializer::PoolingAlgorithm GetFlatBufferPoolingAlgorithm(armnn::PoolingAlgorithm poolingAlgorithm) { switch (poolingAlgorithm) diff --git a/src/armnnSerializer/SerializerUtils.hpp b/src/armnnSerializer/SerializerUtils.hpp index 48553334ba..edd48a5e25 100644 --- a/src/armnnSerializer/SerializerUtils.hpp +++ b/src/armnnSerializer/SerializerUtils.hpp @@ -18,6 +18,8 @@ armnnSerializer::DataType GetFlatBufferDataType(armnn::DataType dataType); armnnSerializer::DataLayout GetFlatBufferDataLayout(armnn::DataLayout dataLayout); +armnnSerializer::UnaryOperation GetFlatBufferUnaryOperation(armnn::UnaryOperation unaryOperation); + armnnSerializer::PoolingAlgorithm GetFlatBufferPoolingAlgorithm(armnn::PoolingAlgorithm poolingAlgorithm); armnnSerializer::OutputShapeRounding GetFlatBufferOutputShapeRounding( diff --git a/src/armnnSerializer/test/SerializerTests.cpp b/src/armnnSerializer/test/SerializerTests.cpp index 2b13109725..47804fe328 100644 --- a/src/armnnSerializer/test/SerializerTests.cpp +++ b/src/armnnSerializer/test/SerializerTests.cpp @@ -268,32 +268,6 @@ static std::vector<DataType> GenerateRandomData(size_t size) BOOST_AUTO_TEST_SUITE(SerializerTests) -BOOST_AUTO_TEST_CASE(SerializeAbs) -{ - DECLARE_LAYER_VERIFIER_CLASS(Abs) - - const std::string layerName("abs"); - const armnn::TensorInfo tensorInfo({1, 2, 3}, armnn::DataType::Float32); - - armnn::INetworkPtr network = armnn::INetwork::Create(); - armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0); - - armnn::IConnectableLayer* const absLayer = network->AddAbsLayer(layerName.c_str()); - armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0); - - inputLayer->GetOutputSlot(0).Connect(absLayer->GetInputSlot(0)); - absLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); - - inputLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo); - absLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo); - - armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network)); - BOOST_CHECK(deserializedNetwork); - - AbsLayerVerifier verifier(layerName, {tensorInfo}, {tensorInfo}); - deserializedNetwork->Accept(verifier); -} - BOOST_AUTO_TEST_CASE(SerializeAddition) { DECLARE_LAYER_VERIFIER_CLASS(Addition) @@ -2176,31 +2150,6 @@ BOOST_AUTO_TEST_CASE(EnsureResizeBilinearBackwardCompatibility) deserializedNetwork->Accept(verifier); } -BOOST_AUTO_TEST_CASE(SerializeRsqrt) -{ - DECLARE_LAYER_VERIFIER_CLASS(Rsqrt) - - const std::string layerName("rsqrt"); - const armnn::TensorInfo tensorInfo({ 3, 1, 2 }, armnn::DataType::Float32); - - armnn::INetworkPtr network = armnn::INetwork::Create(); - armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0); - armnn::IConnectableLayer* const rsqrtLayer = network->AddRsqrtLayer(layerName.c_str()); - armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0); - - inputLayer->GetOutputSlot(0).Connect(rsqrtLayer->GetInputSlot(0)); - rsqrtLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); - - inputLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo); - rsqrtLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo); - - armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network)); - BOOST_CHECK(deserializedNetwork); - - RsqrtLayerVerifier verifier(layerName, {tensorInfo}, {tensorInfo}); - deserializedNetwork->Accept(verifier); -} - BOOST_AUTO_TEST_CASE(SerializeSlice) { DECLARE_LAYER_VERIFIER_CLASS_WITH_DESCRIPTOR(Slice) |