From 5edc8816118fcddb2681379db04c978041ce8b46 Mon Sep 17 00:00:00 2001 From: Aron Virginas-Tar Date: Tue, 5 Nov 2019 18:00:21 +0000 Subject: IVGCVSW-3837 Add support for per-axis quantization to reference Convolution2d workload Signed-off-by: Aron Virginas-Tar Change-Id: I0ac08ba4864d48e6f64c4ac645dad8ea850be112 --- .../backendsCommon/test/WorkloadDataValidation.cpp | 11 +-- .../test/layerTests/Conv2dTestImpl.cpp | 93 ++++++++++++++++++++++ .../test/layerTests/Conv2dTestImpl.hpp | 5 ++ 3 files changed, 104 insertions(+), 5 deletions(-) (limited to 'src/backends/backendsCommon/test') diff --git a/src/backends/backendsCommon/test/WorkloadDataValidation.cpp b/src/backends/backendsCommon/test/WorkloadDataValidation.cpp index 9773914220..70d00b3a91 100644 --- a/src/backends/backendsCommon/test/WorkloadDataValidation.cpp +++ b/src/backends/backendsCommon/test/WorkloadDataValidation.cpp @@ -605,15 +605,16 @@ BOOST_AUTO_TEST_CASE(BiasPerAxisQuantization_Validate) const TensorShape weightShape{ cOutput, cInput, hInput, wInput }; const TensorShape biasShape { cOutput }; - constexpr DataType dataType = DataType::QuantisedAsymm8; - constexpr DataType biasType = DataType::Signed32; + constexpr DataType inputType = DataType::QuantisedAsymm8; + constexpr DataType weightType = DataType::QuantizedSymm8PerAxis; + constexpr DataType biasType = DataType::Signed32; constexpr float perTensorScale = 1.5f; - const TensorInfo inputInfo (inputShape, dataType, perTensorScale); - const TensorInfo outputInfo(outputShape, dataType, perTensorScale); + const TensorInfo inputInfo (inputShape, inputType, perTensorScale); + const TensorInfo outputInfo(outputShape, inputType, perTensorScale); const std::vector weightPerAxisScales = { 2.50f, 3.50f }; - const TensorInfo weightInfo(weightShape, dataType, weightPerAxisScales, 0); + const TensorInfo weightInfo(weightShape, weightType, weightPerAxisScales, 0); Convolution2dQueueDescriptor queueDescriptor; queueDescriptor.m_Parameters.m_BiasEnabled = true; diff --git a/src/backends/backendsCommon/test/layerTests/Conv2dTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/Conv2dTestImpl.cpp index 198904e71d..5fac09f5b3 100644 --- a/src/backends/backendsCommon/test/layerTests/Conv2dTestImpl.cpp +++ b/src/backends/backendsCommon/test/layerTests/Conv2dTestImpl.cpp @@ -14,6 +14,7 @@ #include +#include #include #include @@ -3035,6 +3036,98 @@ LayerTestResult Convolution1dUint8Test( workloadFactory, memoryManager, 0.1f, 128, biasEnabled); } +LayerTestResult Convolution2dPerAxisQuantTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::DataLayout layout) +{ + using namespace armnn; + + const DataType inputType = DataType::QuantisedAsymm8; + const DataType kernelType = DataType::QuantizedSymm8PerAxis; + const DataType biasType = DataType::Signed32; + + TensorInfo inputInfo ({ 1, 3, 1, 2 }, inputType, 0.5f, 128); + TensorInfo outputInfo({ 1, 3, 1, 3 }, inputType, 1.0f, 128); + + const std::vector quantScales{ 0.5f, 0.75f, 1.0f }; + constexpr unsigned int quantDimension = 0; + + TensorInfo kernelInfo({ 3, 1, 1, 2 }, kernelType, quantScales, quantDimension); + + const std::vector biasQuantScales{ 0.25f, 0.375f, 0.5f }; + TensorInfo biasInfo({ 3 }, biasType, biasQuantScales, quantDimension); + + std::vector inputData = + { + 138, 108, 138, 108, 138, 108 + }; + + std::vector kernelData = + { + 1, 2, 1, 2, 1, 2 + }; + + std::vector biasData = + { + 4, 4, 4 + }; + + std::vector expectedOutputData = + { + 121, 118, 115, 121, 118, 115, 121, 118, 115 + }; + + if (layout == DataLayout::NCHW) + { + PermuteTensorNhwcToNchw(inputInfo, inputData); + PermuteTensorNhwcToNchw(kernelInfo, kernelData); + PermuteTensorNhwcToNchw(outputInfo, expectedOutputData); + } + + Convolution2dDescriptor descriptor; + descriptor.m_StrideX = 1; + descriptor.m_StrideY = 1; + descriptor.m_PadLeft = 0; + descriptor.m_PadRight = 0; + descriptor.m_PadTop = 0; + descriptor.m_PadBottom = 0; + descriptor.m_BiasEnabled = true; + descriptor.m_DataLayout = layout; + + std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputInfo); + std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputInfo); + + WorkloadInfo workloadInfo; + ScopedCpuTensorHandle weightTensor(kernelInfo); + ScopedCpuTensorHandle biasTensor(biasInfo); + + AllocateAndCopyDataToITensorHandle(&weightTensor, kernelData.data()); + AllocateAndCopyDataToITensorHandle(&biasTensor, biasData.data()); + + Convolution2dQueueDescriptor queueDescriptor; + queueDescriptor.m_Parameters = descriptor; + queueDescriptor.m_Weight = &weightTensor; + queueDescriptor.m_Bias = &biasTensor; + + AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get()); + AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get()); + + std::unique_ptr workload = workloadFactory.CreateConvolution2d(queueDescriptor, workloadInfo); + inputHandle->Allocate(); + outputHandle->Allocate(); + + CopyDataToITensorHandle(inputHandle.get(), inputData.data()); + + ExecuteWorkload(*workload, memoryManager); + + LayerTestResult ret(outputInfo); + CopyDataFromITensorHandle(ret.output.origin(), outputHandle.get()); + ret.outputExpected = MakeTensor(outputInfo, expectedOutputData); + + return ret; +} + LayerTestResult CompareConvolution2dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, diff --git a/src/backends/backendsCommon/test/layerTests/Conv2dTestImpl.hpp b/src/backends/backendsCommon/test/layerTests/Conv2dTestImpl.hpp index f5ff586f02..3aac975b3b 100644 --- a/src/backends/backendsCommon/test/layerTests/Conv2dTestImpl.hpp +++ b/src/backends/backendsCommon/test/layerTests/Conv2dTestImpl.hpp @@ -111,6 +111,11 @@ LayerTestResult CompareConvolution2dTest( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::IWorkloadFactory& refWorkloadFactory); +LayerTestResult Convolution2dPerAxisQuantTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::DataLayout layout); + // // DepthwiseConvolution2d // -- cgit v1.2.1