aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFinnWilliamsArm <Finn.Williams@arm.com>2019-09-05 14:34:20 +0100
committerfinn.williams <finn.williams@arm.com>2019-09-10 13:20:58 +0000
commit4ffcc8fb1d4c893e62a8c1fb330fe2742cff5407 (patch)
tree1fe4068e06d57d58da3a1aa9d2b02ca590a0919d /src
parent82046944e787b0dff7631de973847d448a23c8d1 (diff)
downloadarmnn-4ffcc8fb1d4c893e62a8c1fb330fe2742cff5407.tar.gz
IVGCVSW-3739 Add serialization support for Abs
Signed-off-by: FinnWilliamsArm <Finn.Williams@arm.com> Change-Id: I42c348515f3f93efc2e0570bbebdc77306f12468
Diffstat (limited to 'src')
-rw-r--r--src/armnnDeserializer/Deserializer.cpp23
-rw-r--r--src/armnnDeserializer/Deserializer.hpp1
-rw-r--r--src/armnnDeserializer/DeserializerSupport.md1
-rw-r--r--src/armnnDeserializer/test/DeserializeAbs.cpp120
-rw-r--r--src/armnnSerializer/ArmnnSchema.fbs11
-rw-r--r--src/armnnSerializer/Serializer.cpp5
-rw-r--r--src/armnnSerializer/SerializerSupport.md1
-rw-r--r--src/armnnSerializer/test/SerializerTests.cpp38
8 files changed, 197 insertions, 3 deletions
diff --git a/src/armnnDeserializer/Deserializer.cpp b/src/armnnDeserializer/Deserializer.cpp
index ef1235745c..8572023fc4 100644
--- a/src/armnnDeserializer/Deserializer.cpp
+++ b/src/armnnDeserializer/Deserializer.cpp
@@ -185,6 +185,7 @@ Deserializer::Deserializer()
m_ParserFunctions(Layer_MAX+1, &Deserializer::ParseUnsupportedLayer)
{
// register supported layers
+ m_ParserFunctions[Layer_AbsLayer] = &Deserializer::ParseAbs;
m_ParserFunctions[Layer_ActivationLayer] = &Deserializer::ParseActivation;
m_ParserFunctions[Layer_AdditionLayer] = &Deserializer::ParseAdd;
m_ParserFunctions[Layer_BatchToSpaceNdLayer] = &Deserializer::ParseBatchToSpaceNd;
@@ -237,6 +238,8 @@ Deserializer::LayerBaseRawPtr Deserializer::GetBaseLayer(const GraphPtr& graphPt
switch(layerType)
{
+ case Layer::Layer_AbsLayer:
+ return graphPtr->layers()->Get(layerIndex)->layer_as_AbsLayer()->base();
case Layer::Layer_ActivationLayer:
return graphPtr->layers()->Get(layerIndex)->layer_as_ActivationLayer()->base();
case Layer::Layer_AdditionLayer:
@@ -851,6 +854,26 @@ void Deserializer::RegisterOutputSlotOfConnection(uint32_t sourceLayerIndex,
connections.outputSlots[outputSlotIndex] = outputSlot;
}
+void Deserializer::ParseAbs(armnnDeserializer::Deserializer::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);
+
+ IConnectableLayer* layer = m_Network->AddAbsLayer(layerName.c_str());
+ armnn::TensorInfo outputTensorInfo = ToTensorInfo(outputs[0]);
+ layer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
+
+ RegisterInputSlots(graph, layerIndex, layer);
+ RegisterOutputSlots(graph, layerIndex, layer);
+}
+
void Deserializer::ParseActivation(GraphPtr graph, unsigned int layerIndex)
{
CHECK_LAYERS(graph, 0, layerIndex);
diff --git a/src/armnnDeserializer/Deserializer.hpp b/src/armnnDeserializer/Deserializer.hpp
index 591447de21..9ec59fba7a 100644
--- a/src/armnnDeserializer/Deserializer.hpp
+++ b/src/armnnDeserializer/Deserializer.hpp
@@ -77,6 +77,7 @@ private:
using LayerParsingFunction = void(Deserializer::*)(GraphPtr graph, unsigned int layerIndex);
void ParseUnsupportedLayer(GraphPtr graph, unsigned int layerIndex);
+ void ParseAbs(GraphPtr graph, unsigned int layerIndex);
void ParseActivation(GraphPtr graph, unsigned int layerIndex);
void ParseAdd(GraphPtr graph, unsigned int layerIndex);
void ParseBatchToSpaceNd(GraphPtr graph, unsigned int layerIndex);
diff --git a/src/armnnDeserializer/DeserializerSupport.md b/src/armnnDeserializer/DeserializerSupport.md
index 1bda123284..c780071461 100644
--- a/src/armnnDeserializer/DeserializerSupport.md
+++ b/src/armnnDeserializer/DeserializerSupport.md
@@ -6,6 +6,7 @@ This reference guide provides a list of layers which can be deserialized current
The Arm NN SDK Deserialize parser currently supports the following layers:
+* Abs
* Activation
* Addition
* BatchToSpaceNd
diff --git a/src/armnnDeserializer/test/DeserializeAbs.cpp b/src/armnnDeserializer/test/DeserializeAbs.cpp
new file mode 100644
index 0000000000..4d6504bc10
--- /dev/null
+++ b/src/armnnDeserializer/test/DeserializeAbs.cpp
@@ -0,0 +1,120 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <boost/test/unit_test.hpp>
+#include "ParserFlatbuffersSerializeFixture.hpp"
+#include "../Deserializer.hpp"
+
+#include <string>
+#include <iostream>
+
+BOOST_AUTO_TEST_SUITE(Deserializer)
+
+ struct AbsFixture : public ParserFlatbuffersSerializeFixture
+ {
+ explicit AbsFixture(const std::string &inputShape,
+ const std::string &outputShape,
+ const std::string &dataType)
+ {
+ m_JsonString = R"(
+ {
+ inputIds: [0],
+ outputIds: [2],
+ layers: [
+ {
+ layer_type: "InputLayer",
+ layer: {
+ base: {
+ layerBindingId: 0,
+ base: {
+ index: 0,
+ layerName: "InputLayer",
+ layerType: "Input",
+ inputSlots: [{
+ index: 0,
+ connection: {sourceLayerIndex:0, outputSlotIndex:0 },
+ }],
+ outputSlots: [{
+ index: 0,
+ tensorInfo: {
+ dimensions: )" + inputShape + R"(,
+ dataType: )" + dataType + R"(
+ }
+ }]
+ }
+ }
+ }
+ },
+ {
+ layer_type: "AbsLayer",
+ layer: {
+ base: {
+ index: 1,
+ layerName: "AbsLayer",
+ layerType: "Abs",
+ inputSlots: [{
+ index: 0,
+ connection: {sourceLayerIndex:0, outputSlotIndex:0 },
+ }],
+ outputSlots: [{
+ index: 0,
+ tensorInfo: {
+ dimensions: )" + outputShape + R"(,
+ dataType: )" + dataType + R"(
+ }
+ }]
+ }
+
+ }
+ },
+ {
+ layer_type: "OutputLayer",
+ layer: {
+ base:{
+ layerBindingId: 2,
+ base: {
+ index: 2,
+ layerName: "OutputLayer",
+ layerType: "Output",
+ inputSlots: [{
+ index: 0,
+ connection: {sourceLayerIndex:1, outputSlotIndex:0 },
+ }],
+ outputSlots: [{
+ index: 0,
+ tensorInfo: {
+ dimensions: )" + outputShape + R"(,
+ dataType: )" + dataType + R"(
+ },
+ }],
+ }
+ }
+ },
+ }
+ ]
+ }
+ )";
+ Setup();
+ }
+ };
+
+ struct SimpleAbsFixture : AbsFixture
+ {
+ SimpleAbsFixture()
+ : AbsFixture("[ 1, 2, 2, 2 ]", // inputShape
+ "[ 1, 2, 2, 2 ]", // outputShape
+ "Float32") // dataType
+ {}
+ };
+
+ BOOST_FIXTURE_TEST_CASE(SimpleAbsTest, SimpleAbsFixture)
+ {
+ RunTest<4, armnn::DataType::Float32>(
+ 0,
+ {{"InputLayer", { -100.0f, -50.5f, -25.9999f, -0.5f , 0.0f, 1.5555f, 25.5f, 100.0f }}},
+ {{"OutputLayer", { 100.0f, 50.0f, 25.9999f, 0.5f , 0.0f, 1.5555f, 25.5f, 100.0f }}});
+ }
+
+BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file
diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs
index 513c74e82d..2b3ec49afd 100644
--- a/src/armnnSerializer/ArmnnSchema.fbs
+++ b/src/armnnSerializer/ArmnnSchema.fbs
@@ -132,7 +132,8 @@ enum LayerType : uint {
TransposeConvolution2d = 42,
Resize = 43,
Stack = 44,
- QuantizedLstm = 45
+ QuantizedLstm = 45,
+ Abs = 46
}
// Base layer table to be used as part of other layers
@@ -150,6 +151,11 @@ table BindableLayerBase {
}
// Table for each layer defined below
+
+table AbsLayer {
+ base:LayerBase;
+}
+
table ActivationLayer {
base:LayerBase;
descriptor:ActivationDescriptor;
@@ -686,7 +692,8 @@ union Layer {
PreluLayer,
TransposeConvolution2dLayer,
ResizeLayer,
- StackLayer
+ StackLayer,
+ AbsLayer
}
table AnyLayer {
diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp
index a8d9c23c04..595573c417 100644
--- a/src/armnnSerializer/Serializer.cpp
+++ b/src/armnnSerializer/Serializer.cpp
@@ -107,7 +107,10 @@ void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer,
void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
{
- throw UnimplementedException("SerializerVisitor::VisitAbsLayer is not implemented");
+ auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
+ auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
+
+ CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
}
// Build FlatBuffer for Activation Layer
diff --git a/src/armnnSerializer/SerializerSupport.md b/src/armnnSerializer/SerializerSupport.md
index f81aa717e5..9babe25683 100644
--- a/src/armnnSerializer/SerializerSupport.md
+++ b/src/armnnSerializer/SerializerSupport.md
@@ -6,6 +6,7 @@ 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
* BatchToSpaceNd
diff --git a/src/armnnSerializer/test/SerializerTests.cpp b/src/armnnSerializer/test/SerializerTests.cpp
index 79d83f054f..b5ef8c6b4e 100644
--- a/src/armnnSerializer/test/SerializerTests.cpp
+++ b/src/armnnSerializer/test/SerializerTests.cpp
@@ -210,6 +210,44 @@ static std::vector<DataType> GenerateRandomData(size_t size)
BOOST_AUTO_TEST_SUITE(SerializerTests)
+BOOST_AUTO_TEST_CASE(SerializeAbs)
+{
+ class AbsLayerVerifier : public LayerVerifierBase
+ {
+ public:
+ AbsLayerVerifier(const std::string& layerName,
+ const std::vector<armnn::TensorInfo>& inputInfos,
+ const std::vector<armnn::TensorInfo>& outputInfos)
+ : LayerVerifierBase(layerName, inputInfos, outputInfos) {}
+
+ void VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name) override
+ {
+ VerifyNameAndConnections(layer, name);
+ }
+ };
+
+ 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)
{
class AdditionLayerVerifier : public LayerVerifierBase