From 3d7efe9a21ad47f33d330240b3b901ad7d5a5a81 Mon Sep 17 00:00:00 2001 From: Bruno Goncalves Date: Thu, 27 Dec 2018 14:21:43 -0200 Subject: Added ConstantLayer support to TfLiteParser Change-Id: Iecc4fe8208b442d9c872e56c3d47249f959c6cc1 --- CMakeLists.txt | 1 + src/armnnTfLiteParser/TfLiteParser.cpp | 34 ++++++++++ src/armnnTfLiteParser/TfLiteParser.hpp | 1 + src/armnnTfLiteParser/test/Constant.cpp | 113 ++++++++++++++++++++++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 src/armnnTfLiteParser/test/Constant.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a12d6b4af8..e8f9c46f4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -453,6 +453,7 @@ if(BUILD_UNIT_TESTS) src/armnnTfLiteParser/test/Addition.cpp src/armnnTfLiteParser/test/AvgPool2D.cpp src/armnnTfLiteParser/test/Concatenation.cpp + src/armnnTfLiteParser/test/Constant.cpp src/armnnTfLiteParser/test/Conv2D.cpp src/armnnTfLiteParser/test/DepthwiseConvolution2D.cpp src/armnnTfLiteParser/test/FullyConnected.cpp diff --git a/src/armnnTfLiteParser/TfLiteParser.cpp b/src/armnnTfLiteParser/TfLiteParser.cpp index 8b2a818e6d..83f6950074 100644 --- a/src/armnnTfLiteParser/TfLiteParser.cpp +++ b/src/armnnTfLiteParser/TfLiteParser.cpp @@ -588,6 +588,7 @@ INetworkPtr TfLiteParser::CreateNetworkFromModel() SetupInputLayers(subgraphIndex); SetupOutputLayers(subgraphIndex); + SetupConstantLayers(subgraphIndex); ++subgraphIndex; } @@ -1742,6 +1743,39 @@ void TfLiteParser::SetupOutputLayers(size_t subgraphIndex) } } +void TfLiteParser::SetupConstantLayers(size_t subgraphIndex) +{ + CHECK_SUBGRAPH(m_Model, subgraphIndex); + + const auto & subGraphPtr = m_Model->subgraphs[subgraphIndex]; + for (unsigned int subgraphIndex = 0; subgraphIndex < m_SubgraphConnections.size(); ++subgraphIndex) + { + for (unsigned int tensorIndex = 0; tensorIndex < m_SubgraphConnections[subgraphIndex].size(); ++tensorIndex) + { + if (m_SubgraphConnections[subgraphIndex][tensorIndex].outputSlot == nullptr && + m_SubgraphConnections[subgraphIndex][tensorIndex].inputSlots.size() > 0) + { + TensorRawPtr tensorPtr = subGraphPtr->tensors[tensorIndex].get(); + armnn::TensorInfo tensorInfo = ToTensorInfo(tensorPtr); + auto tensorAndData = CreateConstTensor(tensorPtr, + tensorInfo, + armnn::Optional()); + + std::string layerName = boost::str(boost::format("Constant:%1%") % tensorPtr->name); + IConnectableLayer *layer = + m_Network->AddConstantLayer(tensorAndData.first, layerName.c_str()); + + layer->GetOutputSlot(0).SetTensorInfo(tensorInfo); + RegisterOutputSlots(subgraphIndex, + VIRTUAL_OPERATOR_ID, + layer, + { tensorIndex }); + + } + } + } +} + // example usage: BufferRawPtr bufferPtr = GetBuffer(m_Model, inputs[0]->buffer); TfLiteParser::BufferRawPtr TfLiteParser::GetBuffer(const ModelPtr& model, size_t bufferIndex) { diff --git a/src/armnnTfLiteParser/TfLiteParser.hpp b/src/armnnTfLiteParser/TfLiteParser.hpp index 594f9e7f4b..1ca00b9ac9 100644 --- a/src/armnnTfLiteParser/TfLiteParser.hpp +++ b/src/armnnTfLiteParser/TfLiteParser.hpp @@ -123,6 +123,7 @@ private: void SetupInputLayers(size_t subgraphIndex); void SetupOutputLayers(size_t subgraphIndex); + void SetupConstantLayers(size_t subgraphIndex); void ResetParser(); diff --git a/src/armnnTfLiteParser/test/Constant.cpp b/src/armnnTfLiteParser/test/Constant.cpp new file mode 100644 index 0000000000..356e1b769d --- /dev/null +++ b/src/armnnTfLiteParser/test/Constant.cpp @@ -0,0 +1,113 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include +#include "ParserFlatbuffersFixture.hpp" +#include "../TfLiteParser.hpp" + +#include +#include + +using armnnTfLiteParser::TfLiteParser; + +BOOST_AUTO_TEST_SUITE(TensorflowLiteParser) + +struct ConstantAddFixture : public ParserFlatbuffersFixture +{ + explicit ConstantAddFixture(const std::string & inputShape, + const std::string & outputShape, + const std::string & constShape, + const std::string & constData) + { + m_JsonString = R"( + { + "version": 3, + "operator_codes": [ { "builtin_code": "ADD" } ], + "subgraphs": [ { + "tensors": [ + { + "shape": )" + constShape + R"( , + "type": "UINT8", + "buffer": 3, + "name": "ConstTensor", + "quantization": { + "min": [ 0.0 ], + "max": [ 255.0 ], + "scale": [ 1.0 ], + "zero_point": [ 0 ], + } + }, + { + "shape": )" + inputShape + R"(, + "type": "UINT8", + "buffer": 1, + "name": "InputTensor", + "quantization": { + "min": [ 0.0 ], + "max": [ 255.0 ], + "scale": [ 1.0 ], + "zero_point": [ 0 ], + } + }, + { + "shape": )" + outputShape + R"( , + "type": "UINT8", + "buffer": 2, + "name": "OutputTensor", + "quantization": { + "min": [ 0.0 ], + "max": [ 255.0 ], + "scale": [ 1.0 ], + "zero_point": [ 0 ], + } + } + ], + "inputs": [ 1 ], + "outputs": [ 2 ], + "operators": [ + { + "opcode_index": 0, + "inputs": [ 1, 0 ], + "outputs": [ 2 ], + "builtin_options_type": "AddOptions", + "builtin_options": { + }, + "custom_options_format": "FLEXBUFFERS" + } + ], + } ], + "buffers" : [ + { }, + { }, + { }, + { "data": )" + constData + R"(, }, + ] + } + )"; + Setup(); + } +}; + + +struct SimpleConstantAddFixture : ConstantAddFixture +{ + SimpleConstantAddFixture() + : ConstantAddFixture("[ 2, 2 ]", // inputShape + "[ 2, 2 ]", // outputShape + "[ 2, 2 ]", // constShape + "[ 4,5, 6,7 ]") // constData + {} +}; + +BOOST_FIXTURE_TEST_CASE(SimpleConstantAdd, SimpleConstantAddFixture) +{ + RunTest<2, armnn::DataType::QuantisedAsymm8>( + 0, + {{"InputTensor", { 0, 1, 2, 3 }}}, + {{"OutputTensor", { 4, 6, 8, 10 }}} + ); +} + +BOOST_AUTO_TEST_SUITE_END() -- cgit v1.2.1