From 747f586b9ae0b206c45d9678becfa4b7c092aeb7 Mon Sep 17 00:00:00 2001 From: Nikhil Raj Date: Fri, 19 Jul 2019 15:15:23 +0100 Subject: IVGCVSW-3479 Add End to End test for Prelu Change-Id: I041bdf9e721a4384ea3c2be0184787dd1f4ea08e Signed-off-by: Nikhil Raj --- src/armnn/InternalTypes.cpp | 1 + src/backends/backendsCommon/test/CMakeLists.txt | 1 + .../backendsCommon/test/PreluEndToEndTestImpl.hpp | 94 ++++++++++++++++++++++ src/backends/reference/test/RefEndToEndTests.cpp | 16 ++++ 4 files changed, 112 insertions(+) create mode 100644 src/backends/backendsCommon/test/PreluEndToEndTestImpl.hpp diff --git a/src/armnn/InternalTypes.cpp b/src/armnn/InternalTypes.cpp index 896e4161ba..143e1b612a 100644 --- a/src/armnn/InternalTypes.cpp +++ b/src/armnn/InternalTypes.cpp @@ -49,6 +49,7 @@ char const* GetLayerTypeAsCString(LayerType type) case LayerType::Permute: return "Permute"; case LayerType::Pooling2d: return "Pooling2d"; case LayerType::PreCompiled: return "PreCompiled"; + case LayerType::Prelu: return "Prelu"; case LayerType::Reshape: return "Reshape"; case LayerType::Rsqrt: return "Rsqrt"; case LayerType::Resize: return "Resize"; diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index bc91bee58e..7c2d0ebfa8 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -40,6 +40,7 @@ list(APPEND armnnBackendsCommonUnitTests_sources OptimizationViewsTests.cpp PermuteTestImpl.hpp Pooling2dTestImpl.hpp + PreluEndToEndTestImpl.hpp QuantizeHelper.hpp QuantizeTestImpl.hpp ResizeEndToEndTestImpl.hpp diff --git a/src/backends/backendsCommon/test/PreluEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/PreluEndToEndTestImpl.hpp new file mode 100644 index 0000000000..0dc1e78ced --- /dev/null +++ b/src/backends/backendsCommon/test/PreluEndToEndTestImpl.hpp @@ -0,0 +1,94 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include + +#include + +#include + +namespace +{ +template +INetworkPtr CreatePreluNetwork(const armnn::TensorInfo& inputInfo, + const armnn::TensorInfo& alphaInfo, + const armnn::TensorInfo& outputInfo) +{ + using namespace armnn; + + INetworkPtr net(INetwork::Create()); + + IConnectableLayer* input = net->AddInputLayer(0, "input"); + IConnectableLayer* alpha = net->AddInputLayer(1, "alpha"); + IConnectableLayer* prelu = net->AddPreluLayer("Prelu"); + IConnectableLayer* output = net->AddOutputLayer(0, "output"); + + Connect(input, prelu, inputInfo, 0, 0); + Connect(alpha, prelu, alphaInfo, 0, 1); + Connect(prelu, output, outputInfo, 0, 0); + + return net; +} + +template> +void PreluEndToEnd(const std::vector& backends, + const std::vector& inputData, + const std::vector& alphaData, + const std::vector& expectedOutputData, + const float qScale , + const int32_t qOffset) +{ + using namespace armnn; + + armnn::TensorInfo inputInfo({ 2, 2, 2, 1 }, ArmnnType); + armnn::TensorInfo alphaInfo({ 1, 2, 2, 1 }, ArmnnType); + armnn::TensorInfo outputInfo({ 2, 2, 2, 1 }, ArmnnType); + + inputInfo.SetQuantizationOffset(qOffset); + inputInfo.SetQuantizationScale(qScale); + alphaInfo.SetQuantizationOffset(qOffset); + alphaInfo.SetQuantizationScale(qScale); + outputInfo.SetQuantizationOffset(qOffset); + outputInfo.SetQuantizationScale(qScale); + + INetworkPtr net = CreatePreluNetwork(inputInfo, alphaInfo, outputInfo); + + BOOST_TEST_CHECKPOINT("Create a network"); + + std::map> inputTensorData = { { 0, inputData }, { 1, alphaData} }; + std::map> expectedOutputTensorData = { { 0, expectedOutputData } }; + + EndToEndLayerTestImpl(move(net), + inputTensorData, + expectedOutputTensorData, + backends); +} + +template> +void PreluEndToEndPositiveTest(const std::vector& backends, const float qScale = 1.0f, + const int32_t qOffset = 2) +{ + std::vector inputData{ 1, 2, 3, 4, 5, 6, 7, 8 }; + std::vector alphaData{ 2, 1, 1, 1 }; + + std::vector expectedOutputData{ 2, 2, 3, 4, 5, 6, 7, 8 }; + + PreluEndToEnd(backends, inputData, alphaData, expectedOutputData, qScale, qOffset); +} + +template> +void PreluEndToEndNegativeTest(const std::vector& backends, const float qScale = 1.0f, + const int32_t qOffset = 0) +{ + std::vector inputData{ 1, -2, 3, 4, 5, 6, 7, 8 }; + std::vector alphaData{ 1, 2, 1, 1 }; + + std::vector expectedOutputData{ 1, -4, 3, 4, 5, 6, 7, 8 }; + + PreluEndToEnd(backends, inputData, alphaData, expectedOutputData, qScale, qOffset); +} + +} // 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 3e8a4690dc..f81f1a708f 100644 --- a/src/backends/reference/test/RefEndToEndTests.cpp +++ b/src/backends/reference/test/RefEndToEndTests.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -715,6 +716,21 @@ BOOST_AUTO_TEST_CASE(RefDetectionPostProcessFastNmsUint8Test) 1.0f, 1, 0.01f, 0, 0.5f, 0); } +BOOST_AUTO_TEST_CASE(RefPreluEndToEndTestFloat32) +{ + PreluEndToEndNegativeTest(defaultBackends); +} + +BOOST_AUTO_TEST_CASE(RefPreluEndToEndTestUint8) +{ + PreluEndToEndPositiveTest(defaultBackends); +} + +BOOST_AUTO_TEST_CASE(RefPreluEndToEndTestQSymm16) +{ + PreluEndToEndPositiveTest(defaultBackends); +} + BOOST_AUTO_TEST_CASE(RefSpaceToDepthNHWCEndToEndTest1) { SpaceToDepthNHWCEndToEndTest1(defaultBackends); -- cgit v1.2.1