diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/armnn/layers/FillLayer.cpp | 10 | ||||
-rw-r--r-- | src/armnnDeserializer/Deserializer.cpp | 24 | ||||
-rw-r--r-- | src/armnnDeserializer/Deserializer.hpp | 1 | ||||
-rw-r--r-- | src/armnnDeserializer/DeserializerSupport.md | 1 | ||||
-rw-r--r-- | src/armnnDeserializer/test/DeserializeFill.cpp | 134 | ||||
-rw-r--r-- | src/armnnSerializer/ArmnnSchema.fbs | 17 | ||||
-rw-r--r-- | src/armnnSerializer/Serializer.cpp | 13 | ||||
-rw-r--r-- | src/armnnSerializer/SerializerSupport.md | 1 | ||||
-rw-r--r-- | src/armnnSerializer/test/SerializerTests.cpp | 29 |
9 files changed, 219 insertions, 11 deletions
diff --git a/src/armnn/layers/FillLayer.cpp b/src/armnn/layers/FillLayer.cpp index 03f93f76da..eb9f6af800 100644 --- a/src/armnn/layers/FillLayer.cpp +++ b/src/armnn/layers/FillLayer.cpp @@ -33,19 +33,21 @@ void FillLayer::ValidateTensorShapesFromInputs() { VerifyLayerConnections(1, CHECK_LOCATION()); - auto inferredShapes = InferOutputShapes({ GetInputSlot(0).GetConnection()->GetTensorInfo().GetShape() }); + auto inferredShapes = InferOutputShapes( { GetInputSlot(0).GetConnection()->GetTensorInfo().GetShape() }); ARMNN_ASSERT(inferredShapes.size() == 1); + // Cannot validate the output shape from the input shape. but we can validate that the correct dims have been + // inferred ConditionalThrowIfNotEqual<LayerValidationException>( "FillLayer: TensorShape set on OutputSlot[0] does not match the inferred shape.", - GetOutputSlot(0).GetTensorInfo().GetShape(), - inferredShapes[0]); + GetOutputSlot(0).GetTensorInfo().GetNumDimensions(), + inferredShapes[0][0]); } void FillLayer::Accept(ILayerVisitor& visitor) const { - visitor.VisitGatherLayer(this, GetName()); + visitor.VisitFillLayer(this, GetParameters(), GetName()); } } // namespace armnn diff --git a/src/armnnDeserializer/Deserializer.cpp b/src/armnnDeserializer/Deserializer.cpp index bea34e16e7..3b69ed17b8 100644 --- a/src/armnnDeserializer/Deserializer.cpp +++ b/src/armnnDeserializer/Deserializer.cpp @@ -204,6 +204,7 @@ m_ParserFunctions(Layer_MAX+1, &Deserializer::ParseUnsupportedLayer) m_ParserFunctions[Layer_ElementwiseUnaryLayer] = &Deserializer::ParseElementwiseUnary; m_ParserFunctions[Layer_EqualLayer] = &Deserializer::ParseEqual; m_ParserFunctions[Layer_FullyConnectedLayer] = &Deserializer::ParseFullyConnected; + m_ParserFunctions[Layer_FillLayer] = &Deserializer::ParseFill; m_ParserFunctions[Layer_FloorLayer] = &Deserializer::ParseFloor; m_ParserFunctions[Layer_GatherLayer] = &Deserializer::ParseGather; m_ParserFunctions[Layer_GreaterLayer] = &Deserializer::ParseGreater; @@ -283,6 +284,8 @@ Deserializer::LayerBaseRawPtr Deserializer::GetBaseLayer(const GraphPtr& graphPt return graphPtr->layers()->Get(layerIndex)->layer_as_EqualLayer()->base(); case Layer::Layer_FullyConnectedLayer: return graphPtr->layers()->Get(layerIndex)->layer_as_FullyConnectedLayer()->base(); + case Layer::Layer_FillLayer: + return graphPtr->layers()->Get(layerIndex)->layer_as_FillLayer()->base(); case Layer::Layer_FloorLayer: return graphPtr->layers()->Get(layerIndex)->layer_as_FloorLayer()->base(); case Layer::Layer_GatherLayer: @@ -1431,6 +1434,27 @@ void Deserializer::ParseEqual(GraphPtr graph, unsigned int layerIndex) RegisterOutputSlots(graph, layerIndex, layer); } +void Deserializer::ParseFill(GraphPtr graph, unsigned int layerIndex) +{ + CHECK_LAYERS(graph, 0, layerIndex); + auto inputs = GetInputs(graph, layerIndex); + CHECK_LOCATION(); + CHECK_VALID_SIZE(inputs.size(), 1); + + auto outputs = GetOutputs(graph, layerIndex); + CHECK_VALID_SIZE(outputs.size(), 1); + + auto layerName = GetLayerName(graph, layerIndex); + armnn::FillDescriptor descriptor(1.0f); + IConnectableLayer* layer = m_Network->AddFillLayer(descriptor, layerName.c_str()); + + armnn::TensorInfo outputTensorInfo = ToTensorInfo(outputs[0]); + layer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo); + + RegisterInputSlots(graph, layerIndex, layer); + RegisterOutputSlots(graph, layerIndex, layer); +} + void Deserializer::ParseGreater(GraphPtr graph, unsigned int layerIndex) { CHECK_LAYERS(graph, 0, layerIndex); diff --git a/src/armnnDeserializer/Deserializer.hpp b/src/armnnDeserializer/Deserializer.hpp index d6ceced7c6..69868c210a 100644 --- a/src/armnnDeserializer/Deserializer.hpp +++ b/src/armnnDeserializer/Deserializer.hpp @@ -96,6 +96,7 @@ private: void ParseDivision(GraphPtr graph, unsigned int layerIndex); void ParseElementwiseUnary(GraphPtr graph, unsigned int layerIndex); void ParseEqual(GraphPtr graph, unsigned int layerIndex); + void ParseFill(GraphPtr graph, unsigned int layerIndex); void ParseFloor(GraphPtr graph, unsigned int layerIndex); void ParseFullyConnected(GraphPtr graph, unsigned int layerIndex); void ParseGather(GraphPtr graph, unsigned int layerIndex); diff --git a/src/armnnDeserializer/DeserializerSupport.md b/src/armnnDeserializer/DeserializerSupport.md index 4e83cc6733..b4982ec78a 100644 --- a/src/armnnDeserializer/DeserializerSupport.md +++ b/src/armnnDeserializer/DeserializerSupport.md @@ -22,6 +22,7 @@ The Arm NN SDK Deserialize parser currently supports the following layers: * DetectionPostProcess * Division * ElementwiseUnary +* Fill * Floor * FullyConnected * Gather diff --git a/src/armnnDeserializer/test/DeserializeFill.cpp b/src/armnnDeserializer/test/DeserializeFill.cpp new file mode 100644 index 0000000000..632734fa9e --- /dev/null +++ b/src/armnnDeserializer/test/DeserializeFill.cpp @@ -0,0 +1,134 @@ +// +// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include <boost/test/unit_test.hpp> +#include "ParserFlatbuffersSerializeFixture.hpp" +#include "../Deserializer.hpp" + +#include <string> + +BOOST_AUTO_TEST_SUITE(Deserializer) + +struct FillFixture : public ParserFlatbuffersSerializeFixture +{ + explicit FillFixture() + { + m_JsonString = R"( + { + layers: [ + { + layer_type: "InputLayer", + layer: { + base: { + base: { + layerName: "InputLayer", + layerType: "Input", + inputSlots: [ + + ], + outputSlots: [ + { + tensorInfo: { + dimensions: [ + 4 + ], + dataType: "Float32", + quantizationScale: 0.0 + } + } + ] + } + } + } + }, + { + layer_type: "FillLayer", + layer: { + base: { + index: 1, + layerName: "FillLayer", + layerType: "Fill", + inputSlots: [ + { + connection: { + sourceLayerIndex: 0, + outputSlotIndex: 0 + } + } + ], + outputSlots: [ + { + tensorInfo: { + dimensions: [ + 1, + 3, + 3, + 1 + ], + dataType: "Float32", + quantizationScale: 0.0 + } + } + ] + }, + descriptor: { + value: 1.0 + } + } + }, + { + layer_type: "OutputLayer", + layer: { + base: { + base: { + index: 2, + layerName: "OutputLayer", + layerType: "Output", + inputSlots: [ + { + connection: { + sourceLayerIndex: 1, + outputSlotIndex: 0 + } + } + ], + outputSlots: [ + + ] + } + } + } + } + ], + inputIds: [ + 0 + ], + outputIds: [ + 0 + ], + featureVersions: { + bindingIdsScheme: 1 + } + } + )"; + Setup(); + } +}; + + +struct SimpleFillFixture : FillFixture +{ + SimpleFillFixture() : FillFixture() {} +}; + +BOOST_FIXTURE_TEST_CASE(Fill, SimpleFillFixture) +{ + RunTest<4, armnn::DataType::Float32>( + 0, + {{"InputLayer", { 1, 3, 3, 1 }}}, + {{"OutputLayer",{ 1, 1, 1, 1, 1, 1, 1, 1, 1}}}); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs index 532c12c706..18415ce785 100644 --- a/src/armnnSerializer/ArmnnSchema.fbs +++ b/src/armnnSerializer/ArmnnSchema.fbs @@ -156,7 +156,8 @@ enum LayerType : uint { StandIn = 53, ElementwiseUnary = 54, Transpose = 55, - QLstm = 56 + QLstm = 56, + Fill = 57 } // Base layer table to be used as part of other layers @@ -284,6 +285,15 @@ table EqualLayer { base:LayerBase; } +table FillLayer { + base:LayerBase; + descriptor:FillDescriptor; +} + +table FillDescriptor { + value:float; +} + table FloorLayer{ base:LayerBase; } @@ -901,7 +911,8 @@ union Layer { StandInLayer, ElementwiseUnaryLayer, TransposeLayer, - QLstmLayer + QLstmLayer, + FillLayer } table AnyLayer { @@ -920,4 +931,4 @@ table SerializedGraph { featureVersions:FeatureCompatibilityVersions; } -root_type SerializedGraph; +root_type SerializedGraph;
\ No newline at end of file diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp index ddd38e18ef..17076c62ab 100644 --- a/src/armnnSerializer/Serializer.cpp +++ b/src/armnnSerializer/Serializer.cpp @@ -472,10 +472,15 @@ void SerializerVisitor::VisitFillLayer(const armnn::IConnectableLayer* layer, const armnn::FillDescriptor& fillDescriptor, const char* name) { - throw UnimplementedException("SerializerVisitor::VisitFillLayer is not implemented"); IgnoreUnused(name); - IgnoreUnused(layer); - IgnoreUnused(fillDescriptor); + + auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill); + + auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value); + + auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor); + + CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer); } void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name) @@ -1726,4 +1731,4 @@ bool Serializer::SaveSerializedToStream(std::ostream& stream) return !stream.bad(); } -} // namespace armnnSerializer +} // namespace armnnSerializer
\ No newline at end of file diff --git a/src/armnnSerializer/SerializerSupport.md b/src/armnnSerializer/SerializerSupport.md index f8d86551ae..4f7868bee7 100644 --- a/src/armnnSerializer/SerializerSupport.md +++ b/src/armnnSerializer/SerializerSupport.md @@ -21,6 +21,7 @@ The Arm NN SDK Serializer currently supports the following layers: * DetectionPostProcess * Division * ElementwiseUnary +* Fill * Floor * FullyConnected * Gather diff --git a/src/armnnSerializer/test/SerializerTests.cpp b/src/armnnSerializer/test/SerializerTests.cpp index e7f93c6740..fa43e09647 100644 --- a/src/armnnSerializer/test/SerializerTests.cpp +++ b/src/armnnSerializer/test/SerializerTests.cpp @@ -1199,6 +1199,35 @@ BOOST_AUTO_TEST_CASE(EnsureEqualBackwardCompatibility) deserializedNetwork->Accept(verifier); } +BOOST_AUTO_TEST_CASE(SerializeFill) +{ + DECLARE_LAYER_VERIFIER_CLASS_WITH_DESCRIPTOR(Fill) + + const std::string layerName("fill"); + const armnn::TensorInfo inputInfo({4}, armnn::DataType::Float32); + const armnn::TensorInfo outputInfo({1, 3, 3, 1}, armnn::DataType::Float32); + + armnn::FillDescriptor descriptor(1.0f); + + armnn::INetworkPtr network = armnn::INetwork::Create(); + armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0); + armnn::IConnectableLayer* const fillLayer = network->AddFillLayer(descriptor, layerName.c_str()); + armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0); + + inputLayer->GetOutputSlot(0).Connect(fillLayer->GetInputSlot(0)); + fillLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + + inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo); + fillLayer->GetOutputSlot(0).SetTensorInfo(outputInfo); + + armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network)); + BOOST_CHECK(deserializedNetwork); + + FillLayerVerifier verifier(layerName, {inputInfo}, {outputInfo}, descriptor); + + deserializedNetwork->Accept(verifier); +} + BOOST_AUTO_TEST_CASE(SerializeFloor) { DECLARE_LAYER_VERIFIER_CLASS(Floor) |