From 3ee1422c824e9dc513566179bcdc0c98657ab0c7 Mon Sep 17 00:00:00 2001 From: Nattapat Chaimanowong Date: Wed, 27 Feb 2019 10:28:09 +0000 Subject: IVGCVSW-2763 Fix bug in BatchToSpaceNdLayer::InferOutputShapes *Also added test case for non-zero crop and moved BatchToSpaceNd test functions together Change-Id: I142ba356165618b2811a4ab650ca6ced35220d9c Signed-off-by: Nattapat Chaimanowong --- src/armnn/layers/BatchToSpaceNdLayer.cpp | 76 ++++++++++-------------------- src/armnn/test/LayerValidateOutputTest.cpp | 10 ++-- 2 files changed, 30 insertions(+), 56 deletions(-) (limited to 'src/armnn') diff --git a/src/armnn/layers/BatchToSpaceNdLayer.cpp b/src/armnn/layers/BatchToSpaceNdLayer.cpp index 9accf28137..a168fe8bbd 100644 --- a/src/armnn/layers/BatchToSpaceNdLayer.cpp +++ b/src/armnn/layers/BatchToSpaceNdLayer.cpp @@ -16,6 +16,8 @@ #include +#include + using namespace armnnUtils; namespace armnn @@ -55,68 +57,40 @@ void BatchToSpaceNdLayer::ValidateTensorShapesFromInputs() std::vector BatchToSpaceNdLayer::InferOutputShapes(const std::vector& inputShapes) const { - const DataLayoutIndexed dataLayout = m_Param.m_DataLayout; - const TensorShape& inputShape = inputShapes[0]; - unsigned int inBatchSize = inputShape[0]; - unsigned int channelSize = inputShape[dataLayout.GetChannelsIndex()]; - - std::vector theBlockShape = m_Param.m_BlockShape; - - unsigned int overallSize = inBatchSize * inputShape[dataLayout.GetHeightIndex()] - * inputShape[dataLayout.GetWidthIndex()]; + BOOST_ASSERT(inputShapes.size() == 1); - std::vector> crops = m_Param.m_Crops; - - std::pair yCrops = crops[0]; - std::pair xCrops = crops[1]; - - unsigned int inputHeight = inputShape[dataLayout.GetHeightIndex()]; - unsigned int outputHeight; + const TensorShape& inputShape = inputShapes[0]; + TensorShape outputShape(inputShape); - unsigned int yCropsTotal = yCrops.first + yCrops.second; + unsigned int accumulatedBlockShape = std::accumulate(m_Param.m_BlockShape.begin(), + m_Param.m_BlockShape.end(), + 1U, + std::multiplies<>()); - BOOST_ASSERT_MSG(yCropsTotal <= inputHeight, - "BatchToSpaceLayer: Overall height crop should be less than or equal to the input height."); + BOOST_ASSERT(inputShape[0] % accumulatedBlockShape == 0); - unsigned int croppedHeight = inputHeight - yCropsTotal; + outputShape[0] = inputShape[0] / accumulatedBlockShape; - if (theBlockShape.at(0) > 0) - { - outputHeight = theBlockShape.at(0) * croppedHeight; - } - else - { - outputHeight = croppedHeight; - } + DataLayoutIndexed dimensionIndices = m_Param.m_DataLayout; + unsigned int heightIndex = dimensionIndices.GetHeightIndex(); + unsigned int widthIndex = dimensionIndices.GetWidthIndex(); - unsigned int outputWidth; - unsigned int inputWidth = inputShape[dataLayout.GetWidthIndex()]; + unsigned int heightCrop = m_Param.m_Crops[0].first + m_Param.m_Crops[0].second; + unsigned int widthCrop = m_Param.m_Crops[1].first + m_Param.m_Crops[1].second; - unsigned int xCropsTotal = xCrops.first + xCrops.second; + unsigned int outputHeight = inputShape[heightIndex] * m_Param.m_BlockShape[0]; + unsigned int outputWidth = inputShape[widthIndex] * m_Param.m_BlockShape[1]; - BOOST_ASSERT_MSG(xCropsTotal <= inputWidth, - "BatchToSpaceLayer: Overall width crop should be less than or equal to the input width."); - unsigned int croppedWidth = inputWidth - xCropsTotal; + BOOST_ASSERT_MSG(heightCrop <= outputHeight, + "BatchToSpaceLayer: Overall height crop should be less than or equal to the uncropped output height."); - if (theBlockShape.at(1) > 0) - { - outputWidth = theBlockShape.at(1) * croppedWidth; - } - else - { - outputWidth = croppedWidth; - } + BOOST_ASSERT_MSG(widthCrop <= outputWidth, + "BatchToSpaceLayer: Overall width crop should be less than or equal to the uncropped output width."); - unsigned int outputBatchSize = overallSize / (outputHeight * outputWidth); + outputShape[heightIndex] = outputHeight - heightCrop; + outputShape[widthIndex] = outputWidth - widthCrop; - if (dataLayout == DataLayout::NHWC) - { - return std::vector({ TensorShape({ outputBatchSize, outputHeight, outputWidth, channelSize }) }); - } - else - { - return std::vector({ TensorShape({ outputBatchSize, channelSize, outputHeight, outputWidth }) }); - } + return std::vector({ outputShape }); } void BatchToSpaceNdLayer::Accept(ILayerVisitor& visitor) const diff --git a/src/armnn/test/LayerValidateOutputTest.cpp b/src/armnn/test/LayerValidateOutputTest.cpp index 62b9c4a0d8..999844e252 100644 --- a/src/armnn/test/LayerValidateOutputTest.cpp +++ b/src/armnn/test/LayerValidateOutputTest.cpp @@ -17,22 +17,22 @@ BOOST_AUTO_TEST_CASE(TestBatchToSpaceInferOutputShape) armnn::Graph graph; armnn::BatchToSpaceNdDescriptor descriptor; - std::vector theBlockShape = {2, 2}; - descriptor.m_BlockShape = theBlockShape; + descriptor.m_BlockShape = {2, 2}; + descriptor.m_Crops = {{0, 0}, {2, 0}}; descriptor.m_DataLayout = armnn::DataLayout::NHWC; armnn::BatchToSpaceNdLayer* const batchToSpaceLayer = graph.AddLayer(descriptor, "batchToSpace"); std::vector shapes; - const std::vector theDimSizes = {4, 2, 2, 1}; + const std::vector theDimSizes = {8, 1, 3, 1}; armnn::TensorShape shape(4, theDimSizes.data()); shapes.push_back(shape); - const std::vector expectedDimSizes = {1, 4, 4, 1}; + const std::vector expectedDimSizes = {2, 2, 4, 1}; armnn::TensorShape expectedShape(4, expectedDimSizes.data()); BOOST_CHECK(expectedShape == batchToSpaceLayer->InferOutputShapes(shapes).at(0)); } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() -- cgit v1.2.1