From 71c80b1d51ce596df1d9f2c6c1b49640e7437eaa Mon Sep 17 00:00:00 2001 From: Narumol Prangnawarat Date: Mon, 17 Jun 2019 17:45:43 +0100 Subject: IVGCVSW-3234 Add unit test for Concat with different quantization params Signed-off-by: Narumol Prangnawarat Change-Id: Ia655b1b6c5f57d2b7c0d9dd17be342cd01f36c09 --- src/backends/backendsCommon/test/LayerTests.hpp | 135 ++++++++++++++++++++++++ src/backends/cl/test/ClLayerTests.cpp | 2 + src/backends/neon/test/NeonLayerTests.cpp | 2 + src/backends/reference/test/RefLayerTests.cpp | 4 + 4 files changed, 143 insertions(+) diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index f3d707cf57..058d6946f6 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -3023,3 +3023,138 @@ LayerTestResult MeanVts3Test( return MeanTestHelper( workloadFactory, memoryManager, inputShape, input, { 2 }, false, outputShape, output); } + +template> +LayerTestResult ConcatDifferentInputOutputQParamTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + bool useSubtensor) +{ + // Defines the tensor descriptors. + armnn::TensorInfo outputTensorInfo({ 3, 6, 3 }, ArmnnType); + armnn::TensorInfo inputTensorInfo1({ 3, 6, 2 }, ArmnnType); + armnn::TensorInfo inputTensorInfo2({ 3, 6, 1 }, ArmnnType); + + std::vector inputTensorShapes({inputTensorInfo1.GetShape(), inputTensorInfo2.GetShape()}); + + // Quantized input1 tensor. + const float inputScale1 = 0.5f; + const int32_t inputOffset1 = 5; + + auto input1 = MakeTensor(inputTensorInfo1, std::vector( + { + 1, 2, 3, + 4, 5, 6, + 7, 8, 9, + 10, 11, 12, + 13, 14, 15, + 16, 17, 18, + + 19, 20, 21, + 22, 23, 24, + 25, 26, 27, + 28, 29, 30, + 31, 32, 33, + 34, 35, 36 + })); + + // Quatized input2 tensor. + const float inputScale2 = 0.2f; + const int32_t inputOffset2 = 10; + + auto input2 = MakeTensor(inputTensorInfo2, std::vector( + { + 37, 38, 39, + 40, 41, 42, + 43, 44, 45, + 46, 47, 48, + 49, 50, 51, + 52, 53, 54 + })); + + // Quantized output tensor. + const float outputScale = 0.1f; + const int32_t outputOffset = 20; + + LayerTestResult ret(outputTensorInfo); + + ret.outputExpected = MakeTensor(outputTensorInfo, std::vector( + { + 0, 5, 74, + 10, 15, 76, + 20, 25, 78, + 30, 35, 80, + 40, 45, 82, + 50, 55, 84, + + 60, 65, 86, + 70, 75, 88, + 80, 85, 90, + 90, 95, 92, + 100, 105, 94, + 110, 115, 96, + + 120, 125, 98, + 130, 135, 100, + 140, 145, 102, + 150, 155, 104, + 160, 165, 106, + 170, 175, 108 + })); + + outputTensorInfo.SetQuantizationScale(outputScale); + outputTensorInfo.SetQuantizationOffset(outputOffset); + inputTensorInfo1.SetQuantizationScale(inputScale1); + inputTensorInfo1.SetQuantizationOffset(inputOffset1); + inputTensorInfo2.SetQuantizationScale(inputScale2); + inputTensorInfo2.SetQuantizationOffset(inputOffset2); + + std::vector wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0]. + armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1); + + std::vector wOrigin2 = { 0, 0, 2 }; //Extent of the window is defined by size of input[1]. + armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2); + + std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); + + bool subTensorsSupported = useSubtensor && workloadFactory.SupportsSubTensors(); + + std::unique_ptr inputHandle1 = + subTensorsSupported ? + workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) : + workloadFactory.CreateTensorHandle(inputTensorInfo1); + + std::unique_ptr inputHandle2 = + subTensorsSupported ? + workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) : + workloadFactory.CreateTensorHandle(inputTensorInfo2); + + armnn::ConcatQueueDescriptor data; + armnn::OriginsDescriptor desc = armnn::CreateDescriptorForConcatenation( + inputTensorShapes.begin(),inputTensorShapes.end(), 2); + data.m_Parameters = desc; + + armnn::WorkloadInfo info; + AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get()); + AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get()); + AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); + + data.m_ViewOrigins.push_back(window1); + data.m_ViewOrigins.push_back(window2); + + std::unique_ptr workload = workloadFactory.CreateConcat(data, info); + + inputHandle1->Allocate(); + inputHandle2->Allocate(); + outputHandle->Allocate(); + + CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]); + CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]); + + workload->PostAllocationConfigure(); + workload->Execute(); + + CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get()); + + return ret; +} diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index 164a42a2b6..0d6f4d3785 100644 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -133,6 +133,8 @@ ARMNN_AUTO_TEST_CASE(CopyViaSplitterUint8, CopyViaSplitterUint8Test) // Concat ARMNN_AUTO_TEST_CASE(SimpleConcat, ConcatTest) ARMNN_AUTO_TEST_CASE(ConcatUint8, ConcatUint8Test) +ARMNN_AUTO_TEST_CASE(ConcatUint8DifferentInputOutputQParam, + ConcatDifferentInputOutputQParamTest, false) // Normalization ARMNN_AUTO_TEST_CASE(SimpleNormalizationAcross, SimpleNormalizationAcrossTest) diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp index af9db52bb1..7802ba2d52 100644 --- a/src/backends/neon/test/NeonLayerTests.cpp +++ b/src/backends/neon/test/NeonLayerTests.cpp @@ -311,6 +311,8 @@ ARMNN_AUTO_TEST_CASE(CopyViaSplitterUint8, CopyViaSplitterUint8Test) // Concat ARMNN_AUTO_TEST_CASE(SimpleConcat, ConcatTest) ARMNN_AUTO_TEST_CASE(ConcatUint8, ConcatUint8Test) +ARMNN_AUTO_TEST_CASE(ConcatUint8DifferentInputOutputQParam, + ConcatDifferentInputOutputQParamTest, false) // Fully Connected ARMNN_AUTO_TEST_CASE(SimpleFullyConnected, FullyConnectedFloat32Test, false, false) diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index a45c248ce6..95e93653bc 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -354,6 +354,10 @@ ARMNN_AUTO_TEST_CASE(SimpleConcat, ConcatTest) ARMNN_AUTO_TEST_CASE(ConcatUint8, ConcatUint8Test) ARMNN_AUTO_TEST_CASE(ConcatUint8DifferentQParams, ConcatUint8DifferentQParamsTest) ARMNN_AUTO_TEST_CASE(ConcatUint16, ConcatUint16Test) +ARMNN_AUTO_TEST_CASE(ConcatUint8DifferentInputOutputQParam, + ConcatDifferentInputOutputQParamTest, true) +ARMNN_AUTO_TEST_CASE(ConcatInt16DifferentInputOutputQParam, + ConcatDifferentInputOutputQParamTest, true) // Add ARMNN_AUTO_TEST_CASE(SimpleAdd, AdditionTest) -- cgit v1.2.1