2 // Copyright © 2019 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
6 #include "DepthToSpaceTestImpl.hpp"
8 #include <QuantizeHelper.hpp>
10 #include <armnn/ArmNN.hpp>
12 #include <backendsCommon/test/DataLayoutUtils.hpp>
13 #include <backendsCommon/test/TensorCopyUtils.hpp>
14 #include <backendsCommon/test/WorkloadTestUtils.hpp>
16 #include <test/TensorHelpers.hpp>
22 LayerTestResult<T, 4> DepthToSpaceTestImpl(
23 armnn::IWorkloadFactory& workloadFactory,
24 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
25 armnn::TensorInfo& inputInfo,
26 armnn::TensorInfo& outputInfo,
27 std::vector<float>& inputData,
28 std::vector<float>& expectedOutputData,
29 armnn::DepthToSpaceQueueDescriptor descriptor,
30 const float qScale = 1.0f,
31 const int32_t qOffset = 0)
33 boost::ignore_unused(memoryManager);
34 if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW)
36 PermuteTensorNhwcToNchw<float>(inputInfo, inputData);
37 PermuteTensorNhwcToNchw<float>(outputInfo, expectedOutputData);
40 if(armnn::IsQuantizedType<T>())
42 inputInfo.SetQuantizationScale(qScale);
43 inputInfo.SetQuantizationOffset(qOffset);
44 outputInfo.SetQuantizationScale(qScale);
45 outputInfo.SetQuantizationOffset(qOffset);
48 boost::multi_array<T, 4> input =
49 MakeTensor<T, 4>(inputInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
51 LayerTestResult<T, 4> result(outputInfo);
52 result.outputExpected =
53 MakeTensor<T, 4>(outputInfo, armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset));
55 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
56 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
58 armnn::WorkloadInfo info;
59 AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
60 AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
62 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDepthToSpace(descriptor, info);
64 inputHandle->Allocate();
65 outputHandle->Allocate();
67 CopyDataToITensorHandle(inputHandle.get(), input.origin());
71 CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
75 } // anonymous namespace
77 template<armnn::DataType ArmnnType, typename T>
78 LayerTestResult<T, 4> DepthToSpaceTest1(
79 armnn::IWorkloadFactory& workloadFactory,
80 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
81 armnn::DataLayout dataLayout)
83 unsigned int inputShape[] = { 1, 1, 1, 8 };
84 unsigned int outputShape[] = { 1, 2, 2, 2 };
87 // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]]
90 // [[[[1, 2, 3], [4, 5, 6]],
91 // [[7, 8, 9], [10, 11, 12]]]]
93 std::vector<float> input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
94 std::vector<float> expectedOutput = input;
96 armnn::DepthToSpaceQueueDescriptor desc;
97 desc.m_Parameters.m_DataLayout = dataLayout;
98 desc.m_Parameters.m_BlockSize = 2;
100 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
101 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
103 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
106 template<armnn::DataType ArmnnType, typename T>
107 LayerTestResult<T, 4> DepthToSpaceTest2(
108 armnn::IWorkloadFactory& workloadFactory,
109 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
110 armnn::DataLayout dataLayout)
112 unsigned int inputShape[] = { 1, 2, 2, 4 };
113 unsigned int outputShape[] = { 1, 4, 4, 1 };
119 // [13, 14, 15, 16]]]]
122 // [[[ [1], [2], [5], [6]],
123 // [ [3], [4], [7], [8]],
124 // [ [9], [10], [13], [14]],
125 // [ [11], [12], [15], [16]]]]
127 std::vector<float> input =
133 9.f, 10.f, 11.f, 12.f,
135 13.f, 14.f, 15.f, 16.f
138 std::vector<float> expectedOutput
142 9.f, 10.f, 13.f, 14.f,
143 11.f, 12.f, 15.f, 16.f
146 armnn::DepthToSpaceQueueDescriptor desc;
147 desc.m_Parameters.m_DataLayout = dataLayout;
148 desc.m_Parameters.m_BlockSize = 2;
150 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
151 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
153 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
156 template<armnn::DataType ArmnnType, typename T>
157 LayerTestResult<T, 4> DepthToSpaceTest3(
158 armnn::IWorkloadFactory& workloadFactory,
159 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
160 armnn::DataLayout dataLayout)
162 unsigned int inputShape[] = { 2, 1, 1, 4 };
163 unsigned int outputShape[] = { 2, 2, 2, 1 };
165 std::vector<float> input =
167 1.f, 2.f, 3.f, 4.f, // batch 0
168 5.f, 6.f, 7.f, 8.f // batch 1
171 std::vector<float> expectedOutput = input;
173 armnn::DepthToSpaceQueueDescriptor desc;
174 desc.m_Parameters.m_DataLayout = dataLayout;
175 desc.m_Parameters.m_BlockSize = 2;
177 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
178 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
180 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
183 template<armnn::DataType ArmnnType, typename T>
184 LayerTestResult<T, 4> DepthToSpaceTest4(
185 armnn::IWorkloadFactory& workloadFactory,
186 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
187 armnn::DataLayout dataLayout)
189 unsigned int inputShape[] = { 2, 2, 2, 4 };
190 unsigned int outputShape[] = { 2, 4, 4, 1 };
192 std::vector<float> input =
198 9.f, 10.f, 11.f, 12.f,
200 13.f, 14.f, 15.f, 16.f,
203 17.f, 18.f, 19.f, 20.f,
205 21.f, 22.f, 23.f, 24.f,
207 25.f, 26.f, 27.f, 28.f,
209 29.f, 30.f, 31.f, 32.f
212 std::vector<float> expectedOutput
216 9.f, 10.f, 13.f, 14.f,
217 11.f, 12.f, 15.f, 16.f,
220 17.f, 18.f, 21.f, 22.f,
221 19.f, 20.f, 23.f, 24.f,
222 25.f, 26.f, 29.f, 30.f,
223 27.f, 28.f, 31.f, 32.f
226 armnn::DepthToSpaceQueueDescriptor desc;
227 desc.m_Parameters.m_DataLayout = dataLayout;
228 desc.m_Parameters.m_BlockSize = 2;
230 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
231 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
233 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
237 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
238 DepthToSpaceTest1<armnn::DataType::Float32>(
239 armnn::IWorkloadFactory& workloadFactory,
240 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
241 armnn::DataLayout dataLayout);
243 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
244 DepthToSpaceTest2<armnn::DataType::Float32>(
245 armnn::IWorkloadFactory& workloadFactory,
246 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
247 armnn::DataLayout dataLayout);
249 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
250 DepthToSpaceTest3<armnn::DataType::Float32>(
251 armnn::IWorkloadFactory& workloadFactory,
252 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
253 armnn::DataLayout dataLayout);
255 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
256 DepthToSpaceTest4<armnn::DataType::Float32>(
257 armnn::IWorkloadFactory& workloadFactory,
258 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
259 armnn::DataLayout dataLayout);
262 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
263 DepthToSpaceTest1<armnn::DataType::Float16>(
264 armnn::IWorkloadFactory& workloadFactory,
265 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
266 armnn::DataLayout dataLayout);
268 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
269 DepthToSpaceTest2<armnn::DataType::Float16>(
270 armnn::IWorkloadFactory& workloadFactory,
271 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
272 armnn::DataLayout dataLayout);
274 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
275 DepthToSpaceTest3<armnn::DataType::Float16>(
276 armnn::IWorkloadFactory& workloadFactory,
277 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
278 armnn::DataLayout dataLayout);
280 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
281 DepthToSpaceTest4<armnn::DataType::Float16>(
282 armnn::IWorkloadFactory& workloadFactory,
283 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
284 armnn::DataLayout dataLayout);
287 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
288 DepthToSpaceTest1<armnn::DataType::QuantisedAsymm8>(
289 armnn::IWorkloadFactory& workloadFactory,
290 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
291 armnn::DataLayout dataLayout);
293 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
294 DepthToSpaceTest2<armnn::DataType::QuantisedAsymm8>(
295 armnn::IWorkloadFactory& workloadFactory,
296 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
297 armnn::DataLayout dataLayout);
299 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
300 DepthToSpaceTest3<armnn::DataType::QuantisedAsymm8>(
301 armnn::IWorkloadFactory& workloadFactory,
302 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
303 armnn::DataLayout dataLayout);
305 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
306 DepthToSpaceTest4<armnn::DataType::QuantisedAsymm8>(
307 armnn::IWorkloadFactory& workloadFactory,
308 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
309 armnn::DataLayout dataLayout);
312 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
313 DepthToSpaceTest1<armnn::DataType::QuantisedSymm16>(
314 armnn::IWorkloadFactory& workloadFactory,
315 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
316 armnn::DataLayout dataLayout);
318 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
319 DepthToSpaceTest2<armnn::DataType::QuantisedSymm16>(
320 armnn::IWorkloadFactory& workloadFactory,
321 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
322 armnn::DataLayout dataLayout);
324 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
325 DepthToSpaceTest3<armnn::DataType::QuantisedSymm16>(
326 armnn::IWorkloadFactory& workloadFactory,
327 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
328 armnn::DataLayout dataLayout);
330 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
331 DepthToSpaceTest4<armnn::DataType::QuantisedSymm16>(
332 armnn::IWorkloadFactory& workloadFactory,
333 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
334 armnn::DataLayout dataLayout);