From 47c1ddb71932a7c67948939d6a3c73927160cf50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89anna=20=C3=93=20Cath=C3=A1in?= Date: Fri, 12 Oct 2018 14:24:13 +0100 Subject: MLCE-51 MaxPool + Add Unit test Change-Id: Id1619ce72a862841439b68e51113febfb0e38fcc --- src/backends/cl/test/ClLayerTests.cpp | 2 + src/backends/reference/test/RefLayerTests.cpp | 2 + src/backends/test/LayerTests.cpp | 103 ++++++++++++++++++++++++++ src/backends/test/LayerTests.hpp | 1 + 4 files changed, 108 insertions(+) diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index 9934c927e6..58aad99750 100755 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -266,6 +266,8 @@ ARMNN_AUTO_TEST_CASE(SimpleConvertFp16ToFp32, SimpleConvertFp16ToFp32Test) // Convert from Float32 to Float16 ARMNN_AUTO_TEST_CASE(SimpleConvertFp32ToFp16, SimpleConvertFp32ToFp16Test) +ARMNN_AUTO_TEST_CASE(AdditionAfterMaxPool, AdditionAfterMaxPoolTest) + // ============================================================================ // COMPARE tests diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 48bffa94ef..236deddb37 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -277,4 +277,6 @@ ARMNN_AUTO_TEST_CASE(MeanFloatMultipleDims, MeanFloatMultipleDimsTest) ARMNN_AUTO_TEST_CASE(MeanVtsFloat1, MeanVtsFloat1Test) ARMNN_AUTO_TEST_CASE(MeanVtsFloat2, MeanVtsFloat2Test) +ARMNN_AUTO_TEST_CASE(AdditionAfterMaxPool, AdditionAfterMaxPoolTest) + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/backends/test/LayerTests.cpp b/src/backends/test/LayerTests.cpp index f2bc0192ba..4b50e4b5f9 100755 --- a/src/backends/test/LayerTests.cpp +++ b/src/backends/test/LayerTests.cpp @@ -5432,3 +5432,106 @@ LayerTestResult MeanVtsFloat2Test(armnn::IWorkloadFactory& workloadFac return MeanTestHelper(workloadFactory, inputShape, input, {0, 2}, true, outputShape, output); } + +LayerTestResult AdditionAfterMaxPoolTest(armnn::IWorkloadFactory& workloadFactory) +{ + // Create Initial Tensor + // 1, 2, 3 + // 4, 5, 6 + // 7, 8, 9 + + armnn::TensorInfo poolingInputTensorInfo({ 1, 1, 3, 3}, armnn::GetDataType()); + armnn::TensorInfo poolingOutputTensorInfo({ 1, 1, 2, 2}, armnn::GetDataType()); + + boost::multi_array poolingInput = MakeTensor(poolingInputTensorInfo, + {1, 2, 3, + 4, 5, 6, + 7, 8, 9 + }); + + std::unique_ptr poolingInputHandle = + workloadFactory.CreateTensorHandle(poolingInputTensorInfo); + std::unique_ptr poolingOutputHandle = + workloadFactory.CreateTensorHandle(poolingOutputTensorInfo); + + // Apply MaxPool poolSize = 1x1, stride=2x2 + // Result = + // 1, 3 + // 7, 9 + armnn::Pooling2dDescriptor descriptor; + descriptor.m_PoolHeight = 1; + descriptor.m_PoolWidth = 1; + descriptor.m_StrideX = 2; + descriptor.m_StrideY = 2; + descriptor.m_PoolType = armnn::PoolingAlgorithm::Max; + + armnn::Pooling2dQueueDescriptor queueDescriptor; + queueDescriptor.m_Parameters = descriptor; + armnn::WorkloadInfo workloadInfo; + AddInputToWorkload(queueDescriptor, workloadInfo, poolingInputTensorInfo, poolingInputHandle.get()); + AddOutputToWorkload(queueDescriptor, workloadInfo, poolingOutputTensorInfo, poolingOutputHandle.get()); + + // Create the MaxPool + std::unique_ptr workload = workloadFactory.CreatePooling2d(queueDescriptor, workloadInfo); + + //LayerTestResult result(poolingOutputTensorInfo); + auto shape( GetTensorShapeAsArray<4>(poolingOutputTensorInfo)); + boost::multi_array resultMaxPool; + resultMaxPool.resize(shape); + + + // Create addition with another tensor the same size + // This would be the result to apply a Conv2d with kernel ones(2) and stride 1x1 + // with the initial tensor. + // 12, 16 + // 24, 28 + + armnn::TensorInfo addInputTensorInfo({ 1,1,2,2}, armnn::GetDataType()); + armnn::TensorInfo addOutputTensorInfo({ 1,1,2,2}, armnn::GetDataType()); + + boost::multi_array addInput = MakeTensor(addInputTensorInfo, + {12, 16, + 24, 28, + }); + + // Expected output tensor after MaxPool and Addition. + LayerTestResult addRet(addOutputTensorInfo); + addRet.outputExpected = MakeTensor(addOutputTensorInfo, std::vector( + { + 13, 19, + 31, 37 + })); + + std::unique_ptr addInputHandle = workloadFactory.CreateTensorHandle(addInputTensorInfo); + std::unique_ptr addOutputHandle = workloadFactory.CreateTensorHandle(addOutputTensorInfo); + + armnn::AdditionQueueDescriptor data; + armnn::WorkloadInfo info; + + // Add the output of the MaxPool and the new tensor + AddInputToWorkload(data, info, poolingOutputTensorInfo, poolingOutputHandle.get()); + AddInputToWorkload(data, info, addInputTensorInfo, addInputHandle.get()); + AddOutputToWorkload(data, info, addOutputTensorInfo, addOutputHandle.get()); + + std::unique_ptr addWorkload = workloadFactory.CreateAddition(data, info); + + poolingInputHandle->Allocate(); + poolingOutputHandle->Allocate(); + addInputHandle->Allocate(); + addOutputHandle->Allocate(); + + CopyDataToITensorHandle(poolingInputHandle.get(), &poolingInput[0][0][0][0]); + CopyDataFromITensorHandle(&resultMaxPool[0][0][0][0], poolingOutputHandle.get()); + + CopyDataToITensorHandle(poolingOutputHandle.get(), &resultMaxPool[0][0][0][0]); + CopyDataToITensorHandle(addInputHandle.get(), &addInput[0][0][0][0]); + + workload->Execute(); + addWorkload->Execute(); + + CopyDataFromITensorHandle(&addRet.output[0][0][0][0], addOutputHandle.get()); + + workloadFactory.Finalize(); + + return addRet; +} diff --git a/src/backends/test/LayerTests.hpp b/src/backends/test/LayerTests.hpp index 9f8cd3ff25..6687439ddf 100644 --- a/src/backends/test/LayerTests.hpp +++ b/src/backends/test/LayerTests.hpp @@ -376,3 +376,4 @@ LayerTestResult MeanFloatKeepDimsTest(armnn::IWorkloadFactory& workloa LayerTestResult MeanFloatMultipleDimsTest(armnn::IWorkloadFactory& workloadFactory); LayerTestResult MeanVtsFloat1Test(armnn::IWorkloadFactory& workloadFactory); LayerTestResult MeanVtsFloat2Test(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult AdditionAfterMaxPoolTest(armnn::IWorkloadFactory& workloadFactory); \ No newline at end of file -- cgit v1.2.1