From 160edb3a6b10bfe5fd6e3fcc118765265d1722a6 Mon Sep 17 00:00:00 2001 From: Cian McGriskin Date: Tue, 25 Jul 2023 14:15:45 +0100 Subject: IVGCVSW-7887 Add TILE End to End tests * Fix error in InferOutputShapes Signed-off-by: Cian McGriskin Change-Id: I1b38285d82d22715c6502dc63b7bab981e3258e4 --- src/armnn/layers/TileLayer.cpp | 15 +++--- src/backends/backendsCommon/test/CMakeLists.txt | 1 + .../backendsCommon/test/TileEndToEndTestImpl.hpp | 61 ++++++++++++++++++++++ src/backends/reference/test/RefEndToEndTests.cpp | 37 +++++++++++++ 4 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp diff --git a/src/armnn/layers/TileLayer.cpp b/src/armnn/layers/TileLayer.cpp index 3c313905fe..d3629002e0 100644 --- a/src/armnn/layers/TileLayer.cpp +++ b/src/armnn/layers/TileLayer.cpp @@ -33,24 +33,25 @@ std::vector TileLayer::InferOutputShapes(const std::vector multipleShape = m_Param.m_Multiples; - std::vector dimSizes; + uint32_t numberOfDimensions = inputShape.GetNumDimensions(); + std::vector dimensionSizes; + dimensionSizes.reserve(numberOfDimensions); // Check input shape and multiples have same length and multiply them together to get output shape - if(inputShape.GetNumDimensions() == multipleShape.size()) + if(numberOfDimensions == m_Param.m_Multiples.size()) { - for(uint32_t i = 0; i < inputShape.GetNumDimensions(); ++i) + for(uint32_t i = 0; i < numberOfDimensions; ++i) { - dimSizes.insert(dimSizes.begin(), inputShape[i] * multipleShape[i]); + dimensionSizes.emplace_back(inputShape[i] * m_Param.m_Multiples[i]); } } else { - throw LayerValidationException("TileLayer: input rank and length of multiples are different."); + throw LayerValidationException("TileLayer: input rank and multiples length are different."); } - return std::vector({TensorShape({inputShape.GetNumElements(), dimSizes.data()})}); + return std::vector({TensorShape({numberOfDimensions, dimensionSizes.data()})}); } void TileLayer::ValidateTensorShapesFromInputs() diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index bbd1324010..7c24f9ca10 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -61,6 +61,7 @@ list(APPEND armnnBackendsCommonUnitTests_sources StridedSliceAsyncEndToEndTest.hpp SubgraphUtilsTest.hpp SubtractionEndToEndTestImpl.hpp + TileEndToEndTestImpl.hpp TransposeEndToEndTestImpl.hpp TensorCopyUtils.hpp WorkloadFactoryHelper.hpp diff --git a/src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp new file mode 100644 index 0000000000..4047e5ad8e --- /dev/null +++ b/src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp @@ -0,0 +1,61 @@ +// +// Copyright © 2023 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once +#include "armnn/INetwork.hpp" +#include "armnnUtils/QuantizeHelper.hpp" +#include +#include +#include + +namespace +{ +using namespace armnn; +armnn::INetworkPtr CreateTileNetwork(TileDescriptor& descriptor, + const armnn::TensorInfo& inputInfo, + const armnn::TensorInfo& outputInfo) +{ + INetworkPtr network(INetwork::Create()); + IConnectableLayer* inputLayer = network->AddInputLayer(0, "input"); + IConnectableLayer* tileLayer = network->AddTileLayer(descriptor, "tile"); + IConnectableLayer* outputLayer = network->AddOutputLayer(0, "output"); + Connect(inputLayer, tileLayer, inputInfo, 0, 0); + Connect(tileLayer, outputLayer, outputInfo, 0, 0); + return network; +} + +template > +void TileEndToEnd(const std::vector& backends) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + bool qConst = true; + + const TensorShape inputTensorShape = { 2, 3 }; + const TensorShape outputTensorShape = { 4, 6 }; + + TensorInfo inputInfo (inputTensorShape, ArmnnType, qScale, qOffset, qConst); + TensorInfo outputInfo (outputTensorShape, ArmnnType,qScale, qOffset); + + std::vector inputData = armnnUtils::QuantizedVector({ + 0.f, 1.f, 2.f, + 3.f, 4.f, 5.f + }, qScale, qOffset); + + std::vector expectedOutputData = armnnUtils::QuantizedVector({ + 0.f, 1.f, 2.f, 0.f, 1.f, 2.f, + 3.f, 4.f, 5.f, 3.f, 4.f, 5.f, + 0.f, 1.f, 2.f, 0.f, 1.f, 2.f, + 3.f, 4.f, 5.f, 3.f, 4.f, 5.f + }, qScale, qOffset); + + auto descriptor = armnn::TileDescriptor(std::vector{ 2, 2 }); + INetworkPtr network = CreateTileNetwork(descriptor, inputInfo, outputInfo); + + std::map> inputTensor = { { 0, inputData } }; + std::map> expectedOutputTensor = { { 0, expectedOutputData } }; + EndToEndLayerTestImpl(std::move(network), inputTensor, expectedOutputTensor, backends); +} + +} // anonymous namespace \ No newline at end of file diff --git a/src/backends/reference/test/RefEndToEndTests.cpp b/src/backends/reference/test/RefEndToEndTests.cpp index eb2aabcd1e..6f05ba77cb 100644 --- a/src/backends/reference/test/RefEndToEndTests.cpp +++ b/src/backends/reference/test/RefEndToEndTests.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -1180,6 +1181,42 @@ TEST_CASE("RefSplitter4dDim3EndToEndUint8Test") Splitter4dDim3EndToEnd(defaultBackends); } +// Tile +TEST_CASE("RefTileEndToEndFloat32") +{ + TileEndToEnd(defaultBackends); +} + +TEST_CASE("RefTileEndToEndFloat16") +{ + TileEndToEnd(defaultBackends); +} + +TEST_CASE("RefTileEndToEndQAsymmS8") +{ + TileEndToEnd(defaultBackends); +} + +TEST_CASE("RefTileEndToEndQAsymmU8") +{ + TileEndToEnd(defaultBackends); +} + +TEST_CASE("RefTileEndToEndQSymmS8") +{ + TileEndToEnd(defaultBackends); +} + +TEST_CASE("RefTileEndToEndQSymmS16") +{ + TileEndToEnd(defaultBackends); +} + +TEST_CASE("RefTileEndToEndSigned32") +{ + TileEndToEnd(defaultBackends); +} + // TransposeConvolution2d TEST_CASE("RefTransposeConvolution2dEndToEndFloatNchwTest") { -- cgit v1.2.1