From 7332ed8ceb38274805641e74537bf4f4fb1188ee Mon Sep 17 00:00:00 2001 From: Mike Kelly Date: Thu, 20 Dec 2018 17:03:06 +0000 Subject: IVGCVSW-2308 Add Conv2d tests where stride > 1 Change-Id: Iae6a3bfad06cb669ef0abea465d03163bb8316f5 --- .../backendsCommon/test/Conv2dTestImpl.hpp | 10 ++- src/backends/backendsCommon/test/LayerTests.cpp | 79 ++++++++++++++++++++++ src/backends/backendsCommon/test/LayerTests.hpp | 6 ++ src/backends/cl/test/ClLayerTests.cpp | 2 + src/backends/neon/test/NeonLayerTests.cpp | 2 + src/backends/reference/test/RefLayerTests.cpp | 5 ++ 6 files changed, 98 insertions(+), 6 deletions(-) (limited to 'src/backends') diff --git a/src/backends/backendsCommon/test/Conv2dTestImpl.hpp b/src/backends/backendsCommon/test/Conv2dTestImpl.hpp index 0ba8d7552c..37fa0f63d6 100755 --- a/src/backends/backendsCommon/test/Conv2dTestImpl.hpp +++ b/src/backends/backendsCommon/test/Conv2dTestImpl.hpp @@ -84,7 +84,9 @@ LayerTestResult SimpleConvolution2dTestImpl( uint32_t padLeft = 0, uint32_t padTop = 0, uint32_t padRight = 0, - uint32_t padBottom = 0) + uint32_t padBottom = 0, + uint32_t strideX = 1, + uint32_t strideY = 1) { unsigned int inputHeight = boost::numeric_cast(originalInput.shape()[2]); unsigned int inputWidth = boost::numeric_cast(originalInput.shape()[3]); @@ -181,10 +183,6 @@ LayerTestResult SimpleConvolution2dTestImpl( } ret.outputExpected = MakeTensor(outputTensorInfo, outputData); - // Todo: nontrivial padding and strides. - uint32_t strideX = 1; - uint32_t strideY = 1; - std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); @@ -240,7 +238,7 @@ LayerTestResult SimpleConvolution2dNhwcTestImpl( const boost::multi_array& kernel, const boost::multi_array& bias, const boost::multi_array& outputExpected, - armnn::DataLayout dataLayout, + const armnn::DataLayout dataLayout, float qScale, int32_t qOffset, uint32_t padLeft = 1, diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index 43b0d33bdd..ddf0d0b587 100755 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -298,6 +298,71 @@ LayerTestResult SimpleConvolution2d3x3NhwcTestCommon( qOffset); } +template +LayerTestResult SimpleConvolution2d3x3Stride2x2TestCommon( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float qScale, + int32_t qOffset, + bool biasEnabled, + const armnn::DataLayout& dataLayout) +{ + // Input is a single-batch, 1 channel, 5x5 image. + armnn::TensorInfo inputDesc({1, 5, 5, 1}, armnn::GetDataType()); + boost::multi_array input = MakeTensor(inputDesc, + { + 1, 5, 2, 3, 5, + 8, 7, 3, 6, 3, + 3, 3, 9, 1, 9, + 4, 1, 8, 1, 3, + 6, 8, 1, 9, 2 + }); + + // Use a 3x3 kernel. + armnn::TensorInfo kernelDesc({1, 3, 3, 1}, armnn::GetDataType()); + boost::multi_array kernel = MakeTensor(kernelDesc, + { + 4, 5, 6, + 0, 0, 0, + 3, 2, 1 + }); + + // Expected output is a single-batch, 1 channel, 3x3 image. + armnn::TensorInfo outputDesc({1, 3, 3, 1}, armnn::GetDataType()); + + const std::vector outputData = + { + 23, 33, 24, + 91, 99, 48, + 26, 50, 19 + }; + + boost::multi_array expectedOutput = MakeTensor(outputDesc, outputData); + + uint32_t padLeft = 1; + uint32_t padTop = 1; + uint32_t padRight = 1; + uint32_t padBottom = 1; + uint32_t strideX = 2; + uint32_t strideY = 2; + + return SimpleConvolution2dNhwcTestImpl(workloadFactory, + memoryManager, + input, + kernel, + boost::multi_array(), + expectedOutput, + dataLayout, + qScale, + qOffset, + padLeft, + padTop, + padRight, + padBottom, + strideX, + strideY); +} + LayerTestResult SimpleConvolution2d3x5Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, @@ -338,6 +403,20 @@ LayerTestResult SimpleConvolution2d3x3NhwcTest( armnn::DataLayout::NHWC); } +LayerTestResult SimpleConvolution2d3x3Stride2x2Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + bool biasEnabled, + const armnn::DataLayout layout) +{ + return SimpleConvolution2d3x3Stride2x2TestCommon(workloadFactory, + memoryManager, + 0.f, + 0, + biasEnabled, + layout); +} + LayerTestResult SimpleConvolution2d3x3Uint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 146f8c4cfe..a871594900 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -66,6 +66,12 @@ LayerTestResult SimpleConvolution2d3x3Test( bool biasEnabled, const armnn::DataLayout layout); +LayerTestResult SimpleConvolution2d3x3Stride2x2Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + bool biasEnabled, + const armnn::DataLayout layout); + LayerTestResult SimpleConvolution2d3x3NhwcTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index 92ac5268f8..9b1fac72c5 100755 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -78,6 +78,8 @@ ARMNN_AUTO_TEST_CASE(SimpleConvolution2d3x3Uint8, SimpleConvolution2d3x3Uint8Tes ARMNN_AUTO_TEST_CASE(SimpleConvolution2d3x3Uint8Nhwc, SimpleConvolution2d3x3Uint8Test, true, armnn::DataLayout::NHWC) ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2d, SimpleConvolution2d3x5Test, false, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2dNhwc, SimpleConvolution2d3x5Test, false, armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2dStride2x2Nhwc, + SimpleConvolution2d3x3Stride2x2Test, false, armnn::DataLayout::NHWC) ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2dSquare, SimpleConvolution2d3x3Test, false, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(SimpleConvolution2dAsymmetricPadding, Convolution2dAsymmetricPaddingTest, armnn::DataLayout::NCHW) diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp index 5b83b2bfa8..999009bc6d 100644 --- a/src/backends/neon/test/NeonLayerTests.cpp +++ b/src/backends/neon/test/NeonLayerTests.cpp @@ -34,6 +34,8 @@ ARMNN_AUTO_TEST_CASE(SimpleConvolution2d3x3Uint8, SimpleConvolution2d3x3Uint8Tes ARMNN_AUTO_TEST_CASE(SimpleConvolution2d3x3Uint8Nhwc, SimpleConvolution2d3x3Uint8Test, true, armnn::DataLayout::NHWC) ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2d, SimpleConvolution2d3x5Test, false, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2dNhwc, SimpleConvolution2d3x5Test, false, armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2dStride2x2Nhwc, + SimpleConvolution2d3x3Stride2x2Test, false, armnn::DataLayout::NHWC) ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2dSquare, SimpleConvolution2d3x3Test, false, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(SimpleConvolution2dAsymmetricPadding, Convolution2dAsymmetricPaddingTest, armnn::DataLayout::NCHW) diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 6e7da13831..7223f04ea9 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -42,6 +42,11 @@ ARMNN_AUTO_TEST_CASE(SimpleConvolution2d3x3Uint8Nhwc, SimpleConvolution2d3x3Uint ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2dSquare, SimpleConvolution2d3x3Test, false, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2dSquareNhwc, SimpleConvolution2d3x3Test, false, armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(UnbiasedConvolution2dSquareStride2x2Nhwc, + SimpleConvolution2d3x3Stride2x2Test, + false, + armnn::DataLayout::NHWC) + ARMNN_AUTO_TEST_CASE(SimpleConvolution2dAsymmetricPaddingLargerThanHalfKernelSize, Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTest, armnn::DataLayout::NCHW) -- cgit v1.2.1