diff options
author | Aron Virginas-Tar <Aron.Virginas-Tar@arm.com> | 2019-09-23 19:11:59 +0100 |
---|---|---|
committer | Kevin May <kevin.may@arm.com> | 2019-09-24 14:30:22 +0000 |
commit | 73f66421c6719c007325b69d51ca73dd58eb8c33 (patch) | |
tree | 69a6311caa36255be5d3b55383a2067f9d4d96fb /src/backends/backendsCommon | |
parent | 1d18e6f74f7a76befe64fa34e7dbfaa8580875ee (diff) | |
download | armnn-73f66421c6719c007325b69d51ca73dd58eb8c33.tar.gz |
IVGCVSW-3885 Add reference workload for DepthToSpace
Signed-off-by: Aron Virginas-Tar <Aron.Virginas-Tar@arm.com>
Change-Id: Id937dc4425884ad1985dcdfaae8bf3fb64f0c766
Diffstat (limited to 'src/backends/backendsCommon')
5 files changed, 382 insertions, 0 deletions
diff --git a/src/backends/backendsCommon/common.mk b/src/backends/backendsCommon/common.mk index abf924aca5..343af5a019 100644 --- a/src/backends/backendsCommon/common.mk +++ b/src/backends/backendsCommon/common.mk @@ -45,6 +45,7 @@ COMMON_TEST_SOURCES := \ test/layerTests/ConvertFp16ToFp32TestImpl.cpp \ test/layerTests/ConvertFp32ToFp16TestImpl.cpp \ test/layerTests/DebugTestImpl.cpp \ + test/layerTests/DepthToSpaceTestImpl.cpp \ test/layerTests/DequantizeTestImpl.cpp \ test/layerTests/DivisionTestImpl.cpp \ test/layerTests/EqualTestImpl.cpp \ diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index 0cebf90319..481d7d8423 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -63,6 +63,8 @@ list(APPEND armnnBackendsCommonUnitTests_sources layerTests/ConvertFp32ToFp16TestImpl.hpp layerTests/DebugTestImpl.cpp layerTests/DebugTestImpl.hpp + layerTests/DepthToSpaceTestImpl.cpp + layerTests/DepthToSpaceTestImpl.hpp layerTests/DequantizeTestImpl.cpp layerTests/DequantizeTestImpl.hpp layerTests/DetectionPostProcessTestImpl.hpp diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 14ff26610f..84125b55d3 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -17,6 +17,7 @@ #include <backendsCommon/test/layerTests/Conv2dTestImpl.hpp> #include <backendsCommon/test/layerTests/ConstantTestImpl.hpp> #include <backendsCommon/test/layerTests/DebugTestImpl.hpp> +#include <backendsCommon/test/layerTests/DepthToSpaceTestImpl.hpp> #include <backendsCommon/test/layerTests/DequantizeTestImpl.hpp> #include <backendsCommon/test/layerTests/DetectionPostProcessTestImpl.hpp> #include <backendsCommon/test/layerTests/DivisionTestImpl.hpp> diff --git a/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp new file mode 100644 index 0000000000..9588f560ef --- /dev/null +++ b/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp @@ -0,0 +1,342 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "DepthToSpaceTestImpl.hpp" + +#include <Permute.hpp> + +#include <armnn/ArmNN.hpp> + +#include <backendsCommon/test/TensorCopyUtils.hpp> +#include <backendsCommon/test/WorkloadTestUtils.hpp> + +#include <test/TensorHelpers.hpp> + +namespace +{ + +template<typename T> +LayerTestResult<T, 4> DepthToSpaceTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::TensorInfo& inputInfo, + armnn::TensorInfo& outputInfo, + std::vector<float>& inputData, + std::vector<float>& expectedOutputData, + armnn::DepthToSpaceQueueDescriptor descriptor, + const float qScale = 1.0f, + const int32_t qOffset = 0) +{ + const armnn::PermutationVector permVector{0, 2, 3, 1}; + + if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW) + { + inputInfo = armnnUtils::Permuted(inputInfo, permVector); + outputInfo = armnnUtils::Permuted(outputInfo, permVector); + + constexpr size_t typeSize = sizeof(float); + + std::vector<float> inputTmp(inputData.size()); + armnnUtils::Permute(inputInfo.GetShape(), permVector, inputData.data(), inputTmp.data(), typeSize); + inputData = inputTmp; + + std::vector<float> outputTmp(expectedOutputData.size()); + armnnUtils::Permute(outputInfo.GetShape(), permVector, expectedOutputData.data(), outputTmp.data(), typeSize); + expectedOutputData = outputTmp; + } + + if(armnn::IsQuantizedType<T>()) + { + inputInfo.SetQuantizationScale(qScale); + inputInfo.SetQuantizationOffset(qOffset); + outputInfo.SetQuantizationScale(qScale); + outputInfo.SetQuantizationOffset(qOffset); + } + + boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputInfo, QuantizedVector<T>(qScale, qOffset, inputData)); + + LayerTestResult<T, 4> result(outputInfo); + result.outputExpected = MakeTensor<T, 4>(outputInfo, QuantizedVector<T>(qScale, qOffset, expectedOutputData)); + + std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo); + std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo); + + armnn::WorkloadInfo info; + AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get()); + AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get()); + + std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDepthToSpace(descriptor, info); + + inputHandle->Allocate(); + outputHandle->Allocate(); + + CopyDataToITensorHandle(inputHandle.get(), input.origin()); + + workload->Execute(); + + CopyDataFromITensorHandle(result.output.origin(), outputHandle.get()); + return result; +} + +} // anonymous namespace + +template<armnn::DataType ArmnnType, typename T> +LayerTestResult<T, 4> DepthToSpaceTest1( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout) +{ + unsigned int inputShape[] = { 1, 1, 1, 8 }; + unsigned int outputShape[] = { 1, 2, 2, 2 }; + + // in: + // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]] + // + // out: + // [[[[1, 2, 3], [4, 5, 6]], + // [[7, 8, 9], [10, 11, 12]]]] + + std::vector<float> input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f }; + std::vector<float> expectedOutput = input; + + armnn::DepthToSpaceQueueDescriptor desc; + desc.m_Parameters.m_DataLayout = dataLayout; + desc.m_Parameters.m_BlockSize = 2; + + armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); + armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); + + return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); +} + +template<armnn::DataType ArmnnType, typename T> +LayerTestResult<T, 4> DepthToSpaceTest2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout) +{ + unsigned int inputShape[] = { 1, 2, 2, 4 }; + unsigned int outputShape[] = { 1, 4, 4, 1 }; + + // in: + // [[[[1, 2, 3, 4], + // [5, 6, 7, 8]], + // [[9, 10, 11, 12], + // [13, 14, 15, 16]]]] + // + // out: + // [[[ [1], [2], [5], [6]], + // [ [3], [4], [7], [8]], + // [ [9], [10], [13], [14]], + // [ [11], [12], [15], [16]]]] + + std::vector<float> input = + { + 1.f, 2.f, 3.f, 4.f, + + 5.f, 6.f, 7.f, 8.f, + + 9.f, 10.f, 11.f, 12.f, + + 13.f, 14.f, 15.f, 16.f + }; + + std::vector<float> expectedOutput + { + 1.f, 2.f, 5.f, 6.f, + 3.f, 4.f, 7.f, 8.f, + 9.f, 10.f, 13.f, 14.f, + 11.f, 12.f, 15.f, 16.f + }; + + armnn::DepthToSpaceQueueDescriptor desc; + desc.m_Parameters.m_DataLayout = dataLayout; + desc.m_Parameters.m_BlockSize = 2; + + armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); + armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); + + return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); +} + +template<armnn::DataType ArmnnType, typename T> +LayerTestResult<T, 4> DepthToSpaceTest3( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout) +{ + unsigned int inputShape[] = { 2, 1, 1, 4 }; + unsigned int outputShape[] = { 2, 2, 2, 1 }; + + std::vector<float> input = + { + 1.f, 2.f, 3.f, 4.f, // batch 0 + 5.f, 6.f, 7.f, 8.f // batch 1 + }; + + std::vector<float> expectedOutput = input; + + armnn::DepthToSpaceQueueDescriptor desc; + desc.m_Parameters.m_DataLayout = dataLayout; + desc.m_Parameters.m_BlockSize = 2; + + armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); + armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); + + return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); +} + +template<armnn::DataType ArmnnType, typename T> +LayerTestResult<T, 4> DepthToSpaceTest4( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout) +{ + unsigned int inputShape[] = { 2, 2, 2, 4 }; + unsigned int outputShape[] = { 2, 4, 4, 1 }; + + std::vector<float> input = + { + 1.f, 2.f, 3.f, 4.f, + + 5.f, 6.f, 7.f, 8.f, + + 9.f, 10.f, 11.f, 12.f, + + 13.f, 14.f, 15.f, 16.f, + + + 17.f, 18.f, 19.f, 20.f, + + 21.f, 22.f, 23.f, 24.f, + + 25.f, 26.f, 27.f, 28.f, + + 29.f, 30.f, 31.f, 32.f + }; + + std::vector<float> expectedOutput + { + 1.f, 2.f, 5.f, 6.f, + 3.f, 4.f, 7.f, 8.f, + 9.f, 10.f, 13.f, 14.f, + 11.f, 12.f, 15.f, 16.f, + + + 17.f, 18.f, 21.f, 22.f, + 19.f, 20.f, 23.f, 24.f, + 25.f, 26.f, 29.f, 30.f, + 27.f, 28.f, 31.f, 32.f + }; + + armnn::DepthToSpaceQueueDescriptor desc; + desc.m_Parameters.m_DataLayout = dataLayout; + desc.m_Parameters.m_BlockSize = 2; + + armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); + armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); + + return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); +} + +// Float32 +template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4> +DepthToSpaceTest1<armnn::DataType::Float32>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4> +DepthToSpaceTest2<armnn::DataType::Float32>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4> +DepthToSpaceTest3<armnn::DataType::Float32>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4> +DepthToSpaceTest4<armnn::DataType::Float32>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +// Float16 +template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4> +DepthToSpaceTest1<armnn::DataType::Float16>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4> +DepthToSpaceTest2<armnn::DataType::Float16>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4> +DepthToSpaceTest3<armnn::DataType::Float16>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4> +DepthToSpaceTest4<armnn::DataType::Float16>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +// QuantisedAsymm8 +template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4> +DepthToSpaceTest1<armnn::DataType::QuantisedAsymm8>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4> +DepthToSpaceTest2<armnn::DataType::QuantisedAsymm8>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4> +DepthToSpaceTest3<armnn::DataType::QuantisedAsymm8>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4> +DepthToSpaceTest4<armnn::DataType::QuantisedAsymm8>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +// QuantisedSymm16 +template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4> +DepthToSpaceTest1<armnn::DataType::QuantisedSymm16>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4> +DepthToSpaceTest2<armnn::DataType::QuantisedSymm16>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4> +DepthToSpaceTest3<armnn::DataType::QuantisedSymm16>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4> +DepthToSpaceTest4<armnn::DataType::QuantisedSymm16>( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); diff --git a/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.hpp b/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.hpp new file mode 100644 index 0000000000..4dbcd266d7 --- /dev/null +++ b/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.hpp @@ -0,0 +1,36 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include "LayerTestResult.hpp" + +#include <ResolveType.hpp> + +#include <backendsCommon/IBackendInternal.hpp> +#include <backendsCommon/WorkloadFactory.hpp> + +template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>> +LayerTestResult<T, 4> DepthToSpaceTest1( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>> +LayerTestResult<T, 4> DepthToSpaceTest2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>> +LayerTestResult<T, 4> DepthToSpaceTest3( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>> +LayerTestResult<T, 4> DepthToSpaceTest4( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); |