IVGCVSW-3479 Add End to End test for Prelu
authorNikhil Raj <nikhil.raj@arm.com>
Fri, 19 Jul 2019 14:15:23 +0000 (15:15 +0100)
committerNikhil Raj Arm <nikhil.raj@arm.com>
Fri, 19 Jul 2019 14:33:04 +0000 (14:33 +0000)
Change-Id: I041bdf9e721a4384ea3c2be0184787dd1f4ea08e
Signed-off-by: Nikhil Raj <nikhil.raj@arm.com>
src/armnn/InternalTypes.cpp
src/backends/backendsCommon/test/CMakeLists.txt
src/backends/backendsCommon/test/PreluEndToEndTestImpl.hpp [new file with mode: 0644]
src/backends/reference/test/RefEndToEndTests.cpp

index 896e416..143e1b6 100644 (file)
@@ -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";
index bc91bee..7c2d0eb 100644 (file)
@@ -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 (file)
index 0000000..0dc1e78
--- /dev/null
@@ -0,0 +1,94 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+
+#include <ResolveType.hpp>
+
+#include <armnn/INetwork.hpp>
+
+#include <backendsCommon/test/CommonTestUtils.hpp>
+
+namespace
+{
+template<typename armnn::DataType DataType>
+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<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
+void PreluEndToEnd(const std::vector<BackendId>& backends,
+                   const std::vector<T>& inputData,
+                   const std::vector<T>& alphaData,
+                   const std::vector<T>& 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<ArmnnType>(inputInfo, alphaInfo, outputInfo);
+
+    BOOST_TEST_CHECKPOINT("Create a network");
+
+    std::map<int, std::vector<T>> inputTensorData          = { { 0, inputData }, { 1, alphaData} };
+    std::map<int, std::vector<T>> expectedOutputTensorData = { { 0, expectedOutputData } };
+
+    EndToEndLayerTestImpl<ArmnnType, ArmnnType>(move(net),
+                                                inputTensorData,
+                                                expectedOutputTensorData,
+                                                backends);
+}
+
+template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
+void PreluEndToEndPositiveTest(const std::vector<BackendId>& backends, const float qScale = 1.0f,
+                               const int32_t qOffset = 2)
+{
+    std::vector<T> inputData{ 1, 2, 3, 4, 5, 6, 7, 8 };
+    std::vector<T> alphaData{ 2, 1, 1, 1 };
+
+    std::vector<T> expectedOutputData{ 2, 2, 3, 4, 5, 6, 7, 8 };
+
+    PreluEndToEnd<ArmnnType>(backends, inputData, alphaData, expectedOutputData, qScale, qOffset);
+}
+
+template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
+void PreluEndToEndNegativeTest(const std::vector<BackendId>& backends, const float qScale = 1.0f,
+                               const int32_t qOffset = 0)
+{
+    std::vector<T> inputData{ 1, -2, 3, 4, 5, 6, 7, 8 };
+    std::vector<T> alphaData{ 1, 2, 1, 1 };
+
+    std::vector<T> expectedOutputData{ 1, -4, 3, 4, 5, 6, 7, 8 };
+
+    PreluEndToEnd<ArmnnType>(backends, inputData, alphaData, expectedOutputData, qScale, qOffset);
+}
+
+} // anonymous namespace
\ No newline at end of file
index 3e8a469..f81f1a7 100644 (file)
@@ -11,6 +11,7 @@
 #include <backendsCommon/test/DequantizeEndToEndTestImpl.hpp>
 #include <backendsCommon/test/DetectionPostProcessTestImpl.hpp>
 #include <backendsCommon/test/GatherEndToEndTestImpl.hpp>
+#include <backendsCommon/test/PreluEndToEndTestImpl.hpp>
 #include <backendsCommon/test/ResizeEndToEndTestImpl.hpp>
 #include <backendsCommon/test/SpaceToDepthEndToEndTestImpl.hpp>
 #include <backendsCommon/test/SplitterEndToEndTestImpl.hpp>
@@ -715,6 +716,21 @@ BOOST_AUTO_TEST_CASE(RefDetectionPostProcessFastNmsUint8Test)
                                                                           1.0f, 1, 0.01f, 0, 0.5f, 0);
 }
 
+BOOST_AUTO_TEST_CASE(RefPreluEndToEndTestFloat32)
+{
+    PreluEndToEndNegativeTest<armnn::DataType::Float32>(defaultBackends);
+}
+
+BOOST_AUTO_TEST_CASE(RefPreluEndToEndTestUint8)
+{
+    PreluEndToEndPositiveTest<armnn::DataType::QuantisedAsymm8>(defaultBackends);
+}
+
+BOOST_AUTO_TEST_CASE(RefPreluEndToEndTestQSymm16)
+{
+    PreluEndToEndPositiveTest<armnn::DataType::QuantisedSymm16>(defaultBackends);
+}
+
 BOOST_AUTO_TEST_CASE(RefSpaceToDepthNHWCEndToEndTest1)
 {
     SpaceToDepthNHWCEndToEndTest1(defaultBackends);