From fa62fdcc13943a040420b49a1a9f5772194b6ffd Mon Sep 17 00:00:00 2001 From: Tianle Cheng Date: Fri, 15 Dec 2023 12:38:40 +0000 Subject: IVGCVSW-8118 Added Two-Layer and Three-Layer Maxpool2d EndToEnd tests. Signed-off-by: Tianle Cheng Change-Id: I4d04fef5ce97901cd687e29adf86b18cb54a5d9a --- .../test/Pooling2dEndToEndTestImpl.hpp | 124 ++++++++++++++++++++- .../tosaReference/test/TosaRefEndToEndTests.cpp | 12 +- 2 files changed, 134 insertions(+), 2 deletions(-) diff --git a/src/backends/backendsCommon/test/Pooling2dEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/Pooling2dEndToEndTestImpl.hpp index 026dbfd9b6..7a264e1bb0 100644 --- a/src/backends/backendsCommon/test/Pooling2dEndToEndTestImpl.hpp +++ b/src/backends/backendsCommon/test/Pooling2dEndToEndTestImpl.hpp @@ -1,5 +1,5 @@ // -// Copyright © 2022 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2022-2024 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once @@ -169,4 +169,126 @@ void AvgPool2dEndToEndFloat16(const std::vector& backends, 0.00001f); } +template +armnn::INetworkPtr CreateTwoLayerPooling2dNetwork(const armnn::TensorShape& inputShape, + const armnn::TensorShape& outputShape, + PaddingMethod padMethod = PaddingMethod::Exclude, + PoolingAlgorithm poolAlg = PoolingAlgorithm::Max, + const float qScale = 1.0f, + const int32_t qOffset = 0) +{ + INetworkPtr network(INetwork::Create()); + + TensorInfo inputTensorInfo(inputShape, DataType, qScale, qOffset, true); + TensorInfo outputTensorInfo(outputShape, DataType, qScale, qOffset, true); + + Pooling2dDescriptor descriptor; + descriptor.m_PoolType = poolAlg; + descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3; + descriptor.m_StrideX = descriptor.m_StrideY = 1; + descriptor.m_PadLeft = 1; + descriptor.m_PadRight = 1; + descriptor.m_PadTop = 1; + descriptor.m_PadBottom = 1; + descriptor.m_PaddingMethod = padMethod; + descriptor.m_DataLayout = DataLayout::NHWC; + + IConnectableLayer* input = network->AddInputLayer(0, "input"); + IConnectableLayer* pool1 = network->AddPooling2dLayer(descriptor, "pool_1"); + IConnectableLayer* pool2 = network->AddPooling2dLayer(descriptor, "pool_2"); + IConnectableLayer* output = network->AddOutputLayer(0, "output"); + + Connect(input, pool1, inputTensorInfo, 0, 0); + Connect(pool1, pool2, inputTensorInfo, 0, 0); + Connect(pool2, output, outputTensorInfo, 0, 0); + + return network; +} + +template +armnn::INetworkPtr CreateThreeLayerPooling2dNetwork(const armnn::TensorShape& inputShape, + const armnn::TensorShape& outputShape, + PaddingMethod padMethod = PaddingMethod::Exclude, + PoolingAlgorithm poolAlg = PoolingAlgorithm::Max, + const float qScale = 1.0f, + const int32_t qOffset = 0) +{ + INetworkPtr network(INetwork::Create()); + + TensorInfo inputTensorInfo(inputShape, DataType, qScale, qOffset, true); + TensorInfo outputTensorInfo(outputShape, DataType, qScale, qOffset, true); + + Pooling2dDescriptor descriptor; + descriptor.m_PoolType = poolAlg; + descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3; + descriptor.m_StrideX = descriptor.m_StrideY = 1; + descriptor.m_PadLeft = 1; + descriptor.m_PadRight = 1; + descriptor.m_PadTop = 1; + descriptor.m_PadBottom = 1; + descriptor.m_PaddingMethod = padMethod; + descriptor.m_DataLayout = DataLayout::NHWC; + + IConnectableLayer* input = network->AddInputLayer(0, "input"); + IConnectableLayer* pool1 = network->AddPooling2dLayer(descriptor, "pool_1"); + IConnectableLayer* pool2 = network->AddPooling2dLayer(descriptor, "pool_2"); + IConnectableLayer* pool3 = network->AddPooling2dLayer(descriptor, "pool_3"); + IConnectableLayer* output = network->AddOutputLayer(0, "output"); + + Connect(input, pool1, inputTensorInfo, 0, 0); + Connect(pool1, pool2, inputTensorInfo, 0, 0); + Connect(pool2, pool3, inputTensorInfo, 0, 0); + Connect(pool3, output, outputTensorInfo, 0, 0); + + return network; +} + +template> +void MaxPool2dTwoLayerEndToEnd(const std::vector& backends, + PaddingMethod padMethod = PaddingMethod::Exclude) +{ + const TensorShape& inputShape = { 1, 3, 3, 1 }; + const TensorShape& outputShape = { 1, 3, 3, 1 }; + + INetworkPtr network = CreateTwoLayerPooling2dNetwork(inputShape, outputShape, padMethod); + + CHECK(network); + + std::vector inputData{ 1, 2, 3, + 4, 5, 6, + 7, 8, 9 }; + std::vector expectedOutput{ 9, 9, 9, + 9, 9, 9, + 9, 9, 9 }; + + std::map> inputTensorData = { { 0, inputData } }; + std::map> expectedOutputData = { { 0, expectedOutput } }; + + EndToEndLayerTestImpl(std::move(network), inputTensorData, expectedOutputData, backends); +} + +template> +void MaxPool2dThreeLayerEndToEnd(const std::vector& backends, + PaddingMethod padMethod = PaddingMethod::Exclude) +{ + const TensorShape& inputShape = { 1, 3, 3, 1 }; + const TensorShape& outputShape = { 1, 3, 3, 1 }; + + INetworkPtr network = CreateThreeLayerPooling2dNetwork(inputShape, outputShape, padMethod); + + CHECK(network); + + std::vector inputData{ 1, 2, 3, + 4, 5, 6, + 7, 8, 9 }; + std::vector expectedOutput{ 9, 9, 9, + 9, 9, 9, + 9, 9, 9 }; + + std::map> inputTensorData = { { 0, inputData } }; + std::map> expectedOutputData = { { 0, expectedOutput } }; + + EndToEndLayerTestImpl(std::move(network), inputTensorData, expectedOutputData, backends); +} + } // anonymous namespace diff --git a/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp b/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp index 914df766eb..63fa69d8a9 100644 --- a/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp +++ b/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2022-2024 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -134,6 +134,16 @@ TEST_CASE("TosaRefMaxPool2DIgnoreValueEndtoEndTestFloat32") MaxPool2dEndToEnd(tosaDefaultBackends, PaddingMethod::IgnoreValue); } +TEST_CASE("TosaRefMaxPool2DTwoLayerEndtoEndTestFloat32") +{ + MaxPool2dTwoLayerEndToEnd(tosaDefaultBackends); +} + +TEST_CASE("TosaRefMaxPool2DThreeLayerEndtoEndTestFloat32") +{ + MaxPool2dThreeLayerEndToEnd(tosaDefaultBackends); +} + // Quantization TEST_CASE("TosaRefQuantizeFromFloat32ToInt8") { -- cgit v1.2.1