From 49bdb794170c3d25e3e51fc7b4c267c3d8dbcebf Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Thu, 11 Feb 2021 13:57:07 +0000 Subject: MLCE-360 'ReduceLayer InferOutputShape Issue' * Updated ParseReduce() function in TfLiteParser to read correct axis data * Remove unused m_TargetWidth and m_TargetHight from ReduceDescriptor * Updated the ArmNN Serializer Schema Signed-off-by: Sadik Armagan Change-Id: I98b6e00ccba1d8ea8c845cb1ae28840e42339629 --- include/armnn/Descriptors.hpp | 12 ++---------- src/armnnDeserializer/Deserializer.cpp | 2 -- src/armnnSerializer/ArmnnSchema.fbs | 2 -- src/armnnSerializer/ArmnnSchema_generated.h | 30 +++-------------------------- src/armnnSerializer/Serializer.cpp | 2 -- src/armnnTfLiteParser/TfLiteParser.cpp | 21 +++++++++++--------- src/armnnTfLiteParser/test/Reduce.cpp | 4 ++-- src/armnnTfLiteParser/test/Sum.cpp | 2 +- 8 files changed, 20 insertions(+), 55 deletions(-) diff --git a/include/armnn/Descriptors.hpp b/include/armnn/Descriptors.hpp index d6e37e535e..a8e68aa8c1 100644 --- a/include/armnn/Descriptors.hpp +++ b/include/armnn/Descriptors.hpp @@ -1290,26 +1290,18 @@ struct LogicalBinaryDescriptor struct ReduceDescriptor { ReduceDescriptor() - : m_TargetHeight(0) - , m_TargetWidth(0) - , m_KeepDims(false) + : m_KeepDims(false) , m_vAxis() , m_ReduceOperation(ReduceOperation::Sum) {} bool operator ==(const ReduceDescriptor& rhs) const { - return m_TargetHeight == rhs.m_TargetHeight && - m_TargetWidth == rhs.m_TargetWidth && - m_KeepDims == rhs.m_KeepDims && + return m_KeepDims == rhs.m_KeepDims && m_vAxis == rhs.m_vAxis && m_ReduceOperation == rhs.m_ReduceOperation; } - /// Target height value. - uint32_t m_TargetHeight; - /// Target width value. - uint32_t m_TargetWidth; /// if true then output shape has no change. bool m_KeepDims; /// The indices of the dimensions to reduce. diff --git a/src/armnnDeserializer/Deserializer.cpp b/src/armnnDeserializer/Deserializer.cpp index e98ff15aa9..cbc4758e0e 100644 --- a/src/armnnDeserializer/Deserializer.cpp +++ b/src/armnnDeserializer/Deserializer.cpp @@ -2118,8 +2118,6 @@ void IDeserializer::DeserializerImpl::ParseReduce(GraphPtr graph, unsigned int l auto flatBufferAxis = fbDescriptor->axis(); armnn::ReduceDescriptor descriptor; - descriptor.m_TargetHeight = fbDescriptor->targetHeight(); - descriptor.m_TargetWidth = fbDescriptor->targetWidth(); descriptor.m_KeepDims = fbDescriptor->keepDims(); descriptor.m_vAxis = std::vector(flatBufferAxis->begin(), flatBufferAxis->end()); descriptor.m_ReduceOperation = ToReduceOperation(fbDescriptor->reduceOperation()); diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs index aa539b188f..9dbf6aa3df 100644 --- a/src/armnnSerializer/ArmnnSchema.fbs +++ b/src/armnnSerializer/ArmnnSchema.fbs @@ -895,8 +895,6 @@ table ReduceLayer { } table ReduceDescriptor { - targetHeight:uint; - targetWidth:uint; keepDims:bool = false; axis:[uint]; reduceOperation:ReduceOperation = Sum; diff --git a/src/armnnSerializer/ArmnnSchema_generated.h b/src/armnnSerializer/ArmnnSchema_generated.h index 32548b2144..cb9e686ca9 100644 --- a/src/armnnSerializer/ArmnnSchema_generated.h +++ b/src/armnnSerializer/ArmnnSchema_generated.h @@ -9207,18 +9207,10 @@ inline flatbuffers::Offset CreateReduceLayer( struct ReduceDescriptor FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ReduceDescriptorBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_TARGETHEIGHT = 4, - VT_TARGETWIDTH = 6, - VT_KEEPDIMS = 8, - VT_AXIS = 10, - VT_REDUCEOPERATION = 12 + VT_KEEPDIMS = 4, + VT_AXIS = 6, + VT_REDUCEOPERATION = 8 }; - uint32_t targetHeight() const { - return GetField(VT_TARGETHEIGHT, 0); - } - uint32_t targetWidth() const { - return GetField(VT_TARGETWIDTH, 0); - } bool keepDims() const { return GetField(VT_KEEPDIMS, 0) != 0; } @@ -9230,8 +9222,6 @@ struct ReduceDescriptor FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && - VerifyField(verifier, VT_TARGETHEIGHT) && - VerifyField(verifier, VT_TARGETWIDTH) && VerifyField(verifier, VT_KEEPDIMS) && VerifyOffset(verifier, VT_AXIS) && verifier.VerifyVector(axis()) && @@ -9244,12 +9234,6 @@ struct ReduceDescriptorBuilder { typedef ReduceDescriptor Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; - void add_targetHeight(uint32_t targetHeight) { - fbb_.AddElement(ReduceDescriptor::VT_TARGETHEIGHT, targetHeight, 0); - } - void add_targetWidth(uint32_t targetWidth) { - fbb_.AddElement(ReduceDescriptor::VT_TARGETWIDTH, targetWidth, 0); - } void add_keepDims(bool keepDims) { fbb_.AddElement(ReduceDescriptor::VT_KEEPDIMS, static_cast(keepDims), 0); } @@ -9273,15 +9257,11 @@ struct ReduceDescriptorBuilder { inline flatbuffers::Offset CreateReduceDescriptor( flatbuffers::FlatBufferBuilder &_fbb, - uint32_t targetHeight = 0, - uint32_t targetWidth = 0, bool keepDims = false, flatbuffers::Offset> axis = 0, armnnSerializer::ReduceOperation reduceOperation = armnnSerializer::ReduceOperation_Sum) { ReduceDescriptorBuilder builder_(_fbb); builder_.add_axis(axis); - builder_.add_targetWidth(targetWidth); - builder_.add_targetHeight(targetHeight); builder_.add_reduceOperation(reduceOperation); builder_.add_keepDims(keepDims); return builder_.Finish(); @@ -9289,16 +9269,12 @@ inline flatbuffers::Offset CreateReduceDescriptor( inline flatbuffers::Offset CreateReduceDescriptorDirect( flatbuffers::FlatBufferBuilder &_fbb, - uint32_t targetHeight = 0, - uint32_t targetWidth = 0, bool keepDims = false, const std::vector *axis = nullptr, armnnSerializer::ReduceOperation reduceOperation = armnnSerializer::ReduceOperation_Sum) { auto axis__ = axis ? _fbb.CreateVector(*axis) : 0; return armnnSerializer::CreateReduceDescriptor( _fbb, - targetHeight, - targetWidth, keepDims, axis__, reduceOperation); diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp index a2217a3dc4..28afac7b62 100644 --- a/src/armnnSerializer/Serializer.cpp +++ b/src/armnnSerializer/Serializer.cpp @@ -911,8 +911,6 @@ void SerializerVisitor::VisitReduceLayer(const armnn::IConnectableLayer* layer, { auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce); auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder, - reduceDescriptor.m_TargetHeight, - reduceDescriptor.m_TargetWidth, reduceDescriptor.m_KeepDims, m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis), GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation)); diff --git a/src/armnnTfLiteParser/TfLiteParser.cpp b/src/armnnTfLiteParser/TfLiteParser.cpp index 8ce1667557..ab32ef7822 100644 --- a/src/armnnTfLiteParser/TfLiteParser.cpp +++ b/src/armnnTfLiteParser/TfLiteParser.cpp @@ -3091,19 +3091,24 @@ void TfLiteParserImpl::ParseReduce(size_t subgraphIndex, size_t operatorIndex, R armnn::TensorInfo inputTensorInfo0 = ToTensorInfo(inputs[0]); armnn::TensorInfo inputTensorInfo1 = ToTensorInfo(inputs[1]); - TensorShape input0Shape = inputTensorInfo0.GetShape(); ReduceDescriptor desc; - BufferRawPtr axisBufferPtr = GetBuffer(m_Model, inputs[1]->buffer); // Get const axis value from model and set it to descriptor. if (axisBufferPtr != nullptr) { - for (uint32_t i = 0; i < inputTensorInfo1.GetNumElements(); ++i) - { - desc.m_vAxis.push_back(armnnUtils::GetUnsignedAxis(inputTensorInfo0.GetNumDimensions(), - axisBufferPtr->data.data()[i])); - } + std::vector axisData(inputTensorInfo1.GetNumElements()); + ::memcpy(axisData.data(), axisBufferPtr->data.data(), inputTensorInfo1.GetNumBytes()); + + // Convert the axis to unsigned int and remove duplicates. + auto rank = static_cast(inputTensorInfo0.GetNumDimensions()); + std::set uniqueAxis; + std::transform(axisData.begin(), + axisData.end(), + std::inserter(uniqueAxis, uniqueAxis.begin()), + [rank](int i)->unsigned int{ + return static_cast(((i + rank) % rank)); }); + desc.m_vAxis.assign(uniqueAxis.begin(), uniqueAxis.end()); } else { @@ -3113,8 +3118,6 @@ void TfLiteParserImpl::ParseReduce(size_t subgraphIndex, size_t operatorIndex, R } } - desc.m_TargetHeight = input0Shape[1]; - desc.m_TargetWidth = input0Shape[2]; desc.m_KeepDims = options->keep_dims; desc.m_ReduceOperation = reduceOperation; diff --git a/src/armnnTfLiteParser/test/Reduce.cpp b/src/armnnTfLiteParser/test/Reduce.cpp index 622d54e8b5..c2a22f0b86 100644 --- a/src/armnnTfLiteParser/test/Reduce.cpp +++ b/src/armnnTfLiteParser/test/Reduce.cpp @@ -90,7 +90,7 @@ struct ReduceMaxFixture : public ParserFlatbuffersFixture struct SimpleReduceMaxFixture : public ReduceMaxFixture { - SimpleReduceMaxFixture() : ReduceMaxFixture("[ 1, 1, 2, 3 ]", "[ 1, 1, 1, 3 ]", "[ 1 ]", "[ 2 ]") {} + SimpleReduceMaxFixture() : ReduceMaxFixture("[ 1, 1, 2, 3 ]", "[ 1, 1, 1, 3 ]", "[ 1 ]", "[ 2,0,0,0 ]") {} }; BOOST_FIXTURE_TEST_CASE(ParseReduceMax, SimpleReduceMaxFixture) @@ -179,7 +179,7 @@ struct ReduceMinFixture : public ParserFlatbuffersFixture struct SimpleReduceMinFixture : public ReduceMinFixture { - SimpleReduceMinFixture() : ReduceMinFixture("[ 1, 1, 2, 3 ]", "[ 1, 1, 1, 3 ]", "[ 1 ]", "[ 2 ]") {} + SimpleReduceMinFixture() : ReduceMinFixture("[ 1, 1, 2, 3 ]", "[ 1, 1, 1, 3 ]", "[ 1 ]", "[ 2, 0, 0, 0 ]") {} }; BOOST_FIXTURE_TEST_CASE(ParseReduceMin, SimpleReduceMinFixture) diff --git a/src/armnnTfLiteParser/test/Sum.cpp b/src/armnnTfLiteParser/test/Sum.cpp index 22b19ae058..177bcd52de 100644 --- a/src/armnnTfLiteParser/test/Sum.cpp +++ b/src/armnnTfLiteParser/test/Sum.cpp @@ -90,7 +90,7 @@ struct SumFixture : public ParserFlatbuffersFixture struct SimpleSumFixture : public SumFixture { - SimpleSumFixture() : SumFixture("[ 1, 3, 2, 4 ]", "[ 1, 1, 1, 4 ]", "[ 2 ]", "[ 1, 2 ]") {} + SimpleSumFixture() : SumFixture("[ 1, 3, 2, 4 ]", "[ 1, 1, 1, 4 ]", "[ 2 ]", "[ 1, 0, 0, 0, 2, 0, 0, 0 ]") {} }; BOOST_FIXTURE_TEST_CASE(ParseSum, SimpleSumFixture) -- cgit v1.2.1