From 1e4c31dafb1c8984a126fa1d211ed8f9eedaf7cc Mon Sep 17 00:00:00 2001 From: narpra01 Date: Fri, 28 Sep 2018 11:07:51 +0100 Subject: IVGCVSW-1812 Adding Ref implementation and tests of MeanWorkloads Change-Id: I6fb15c407024e3b91d5abf4513f8090be5821760 --- src/backends/test/LayerTests.cpp | 183 ++++++++++++++++++++++++++++++++++++++- src/backends/test/LayerTests.hpp | 13 +++ src/backends/test/Reference.cpp | 14 +++ 3 files changed, 209 insertions(+), 1 deletion(-) (limited to 'src/backends/test') diff --git a/src/backends/test/LayerTests.cpp b/src/backends/test/LayerTests.cpp index 8f06690018..4f6cb93670 100644 --- a/src/backends/test/LayerTests.cpp +++ b/src/backends/test/LayerTests.cpp @@ -4747,4 +4747,185 @@ LayerTestResult PermuteFloat32ValueSet2Test(armnn::IWorkloadFactory& w LayerTestResult PermuteFloat32ValueSet3Test(armnn::IWorkloadFactory& workloadFactory) { return PermuteFloat32ValueSet3TestCommon(workloadFactory); -}; \ No newline at end of file +}; + +namespace +{ +template +LayerTestResult MeanTestHelper(armnn::IWorkloadFactory& workloadFactory, + const unsigned int* inputShape, + const std::vector& inputData, + const std::vector& axis, + bool keepDims, + const unsigned int* outputShape, + const std::vector& outputData, + float scale = 1.0f, + int32_t offset = 0) +{ + auto dataType = (std::is_same::value ? + armnn::DataType::QuantisedAsymm8 : + armnn::DataType::Float32); + + armnn::TensorInfo inputTensorInfo(InputDim, inputShape, dataType); + armnn::TensorInfo outputTensorInfo(OutputDim, outputShape, dataType); + + inputTensorInfo.SetQuantizationScale(scale); + inputTensorInfo.SetQuantizationOffset(offset); + + outputTensorInfo.SetQuantizationScale(scale); + outputTensorInfo.SetQuantizationOffset(offset); + + auto input = MakeTensor(inputTensorInfo, inputData); + + LayerTestResult result(outputTensorInfo); + result.outputExpected = MakeTensor(outputTensorInfo, outputData); + + std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); + std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); + + armnn::MeanQueueDescriptor data; + data.m_Parameters.m_Axis = axis; + data.m_Parameters.m_KeepDims = keepDims; + armnn::WorkloadInfo info; + AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get()); + AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); + + std::unique_ptr workload = workloadFactory.CreateMean(data, info); + + inputHandle->Allocate(); + outputHandle->Allocate(); + + CopyDataToITensorHandle(inputHandle.get(), input.origin()); + + workloadFactory.Finalize(); + workload->Execute(); + + CopyDataFromITensorHandle(result.output.origin(), outputHandle.get()); + + return result; +} +} // anonymous namespace + +LayerTestResult MeanUint8SimpleTest(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = { 3, 2 }; + const unsigned int outputShape[] = { 1 }; + + std::vector input({ 1, 1, 2, 2, 3, 3 }); + std::vector output({ 2 }); + + return MeanTestHelper(workloadFactory, inputShape, input, {}, false, outputShape, output); +} + +LayerTestResult MeanUint8SimpleAxisTest(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = { 1, 1, 3, 2 }; + const unsigned int outputShape[] = { 1, 1, 2 }; + + std::vector input({ 1, 1, 2, 2, 3, 3 }); + std::vector output({ 2, 2 }); + + return MeanTestHelper(workloadFactory, inputShape, input, {2}, false, outputShape, output); +} + +LayerTestResult MeanUint8KeepDimsTest(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = { 1, 1, 3, 2 }; + const unsigned int outputShape[] = { 1, 1, 1, 2 }; + + std::vector input({ 1, 1, 2, 2, 3, 3 }); + std::vector output({ 2, 2 }); + + return MeanTestHelper(workloadFactory, inputShape, input, {2}, true, outputShape, output); +} + +LayerTestResult MeanUint8MultipleDimsTest(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = { 2, 3, 1, 2 }; + const unsigned int outputShape[] = { 1, 3, 1, 1 }; + + std::vector input({ 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6}); + std::vector output({ 1, 3, 5 }); + + return MeanTestHelper(workloadFactory, inputShape, input, {0, 3}, true, outputShape, output); +} + +LayerTestResult MeanVtsUint8Test(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = {4, 3, 2}; + const unsigned int outputShape[] = { 2 }; + + std::vector input({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}); + std::vector output({12, 13}); + + return MeanTestHelper(workloadFactory, inputShape, input, {0, 1}, false, outputShape, + output, 0.8f, 5); +} + +LayerTestResult MeanFloatSimpleTest(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = { 3, 2 }; + const unsigned int outputShape[] = { 1 }; + + std::vector input({ 1., 1., 2., 2., 3., 3. }); + std::vector output({ 2. }); + + return MeanTestHelper(workloadFactory, inputShape, input, {}, false, outputShape, output); +} + +LayerTestResult MeanFloatSimpleAxisTest(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = { 2, 3, 1, 2 }; + const unsigned int outputShape[] = { 3, 1, 2 }; + + std::vector input({ 1., 2., 3., 4., 5., 6., 1., 2., 3., 4., 5., 6.}); + std::vector output({ 1., 2., 3., 4., 5., 6. }); + + return MeanTestHelper(workloadFactory, inputShape, input, {0}, false, outputShape, output); +} + +LayerTestResult MeanFloatKeepDimsTest(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = { 1, 1, 3, 2 }; + const unsigned int outputShape[] = { 1, 1, 1, 2 }; + + std::vector input({ 1., 1., 2., 2., 3., 3. }); + std::vector output({ 2., 2. }); + + return MeanTestHelper(workloadFactory, inputShape, input, {2}, true, outputShape, output); +} + +LayerTestResult MeanFloatMultipleDimsTest(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = { 2, 3, 1, 2 }; + const unsigned int outputShape[] = { 1, 3, 1, 1 }; + + std::vector input({ 1., 2., 3., 4., 5., 6., 1., 2., 3., 4., 5., 6.}); + std::vector output({ 1.5, 3.5, 5.5 }); + + return MeanTestHelper(workloadFactory, inputShape, input, {0, 3}, true, outputShape, output); +} + +LayerTestResult MeanVtsFloat1Test(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = {4, 3, 2}; + const unsigned int outputShape[] = { 2 }; + + std::vector input({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, + 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f}); + std::vector output({12.0f, 13.0f}); + + return MeanTestHelper(workloadFactory, inputShape, input, {0, 1}, false, outputShape, output); +} + +LayerTestResult MeanVtsFloat2Test(armnn::IWorkloadFactory& workloadFactory) +{ + const unsigned int inputShape[] = {4, 3, 2}; + const unsigned int outputShape[] = {1, 3, 1 }; + + std::vector input({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, + 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f}); + std::vector output({10.5f, 12.5f, 14.5f}); + + return MeanTestHelper(workloadFactory, inputShape, input, {0, 2}, true, outputShape, output); +} diff --git a/src/backends/test/LayerTests.hpp b/src/backends/test/LayerTests.hpp index 365a1f53d4..9dc3afa150 100644 --- a/src/backends/test/LayerTests.hpp +++ b/src/backends/test/LayerTests.hpp @@ -343,3 +343,16 @@ LstmLayerFloat32NoCifgWithPeepholeWithProjectionTest(armnn::IWorkloadFactory& wo LayerTestResult SimpleConvertFp16ToFp32Test(armnn::IWorkloadFactory& workloadFactory); LayerTestResult SimpleConvertFp32ToFp16Test(armnn::IWorkloadFactory& workloadFactory); + + +LayerTestResult MeanUint8SimpleTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult MeanUint8SimpleAxisTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult MeanUint8KeepDimsTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult MeanUint8MultipleDimsTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult MeanVtsUint8Test(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult MeanFloatSimpleTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult MeanFloatSimpleAxisTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult MeanFloatKeepDimsTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult MeanFloatMultipleDimsTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult MeanVtsFloat1Test(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult MeanVtsFloat2Test(armnn::IWorkloadFactory& workloadFactory); diff --git a/src/backends/test/Reference.cpp b/src/backends/test/Reference.cpp index 97a209d757..30a8f8e1a5 100644 --- a/src/backends/test/Reference.cpp +++ b/src/backends/test/Reference.cpp @@ -250,4 +250,18 @@ ARMNN_AUTO_TEST_CASE(SimpleConvertFp16ToFp32, SimpleConvertFp16ToFp32Test) // Convert from Float32 to Float16 ARMNN_AUTO_TEST_CASE(SimpleConvertFp32ToFp16, SimpleConvertFp32ToFp16Test) +// Mean +ARMNN_AUTO_TEST_CASE(MeanUint8Simple, MeanUint8SimpleTest) +ARMNN_AUTO_TEST_CASE(MeanUint8SimpleAxis, MeanUint8SimpleAxisTest) +ARMNN_AUTO_TEST_CASE(MeanUint8KeepDims, MeanUint8KeepDimsTest) +ARMNN_AUTO_TEST_CASE(MeanUint8MultipleDims, MeanUint8MultipleDimsTest) +ARMNN_AUTO_TEST_CASE(MeanVtsUint8, MeanVtsUint8Test) + +ARMNN_AUTO_TEST_CASE(MeanFloatSimple, MeanFloatSimpleTest) +ARMNN_AUTO_TEST_CASE(MeanFloatSimpleAxis, MeanFloatSimpleAxisTest) +ARMNN_AUTO_TEST_CASE(MeanFloatKeepDims, MeanFloatKeepDimsTest) +ARMNN_AUTO_TEST_CASE(MeanFloatMultipleDims, MeanFloatMultipleDimsTest) +ARMNN_AUTO_TEST_CASE(MeanVtsFloat1, MeanVtsFloat1Test) +ARMNN_AUTO_TEST_CASE(MeanVtsFloat2, MeanVtsFloat2Test) + BOOST_AUTO_TEST_SUITE_END() -- cgit v1.2.1