ArmNN
 21.05
DepthToSpaceTestImpl.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
7 
8 #include <QuantizeHelper.hpp>
9 
10 
14 
15 #include <test/TensorHelpers.hpp>
16 
17 namespace
18 {
19 
20 template<typename T>
21 LayerTestResult<T, 4> DepthToSpaceTestImpl(
22  armnn::IWorkloadFactory& workloadFactory,
24  armnn::TensorInfo& inputInfo,
25  armnn::TensorInfo& outputInfo,
26  std::vector<float>& inputData,
27  std::vector<float>& expectedOutputData,
29  const float qScale = 1.0f,
30  const int32_t qOffset = 0)
31 {
32  IgnoreUnused(memoryManager);
34  {
35  PermuteTensorNhwcToNchw<float>(inputInfo, inputData);
36  PermuteTensorNhwcToNchw<float>(outputInfo, expectedOutputData);
37  }
38 
39  if(armnn::IsQuantizedType<T>())
40  {
41  inputInfo.SetQuantizationScale(qScale);
42  inputInfo.SetQuantizationOffset(qOffset);
43  outputInfo.SetQuantizationScale(qScale);
44  outputInfo.SetQuantizationOffset(qOffset);
45  }
46 
47  boost::multi_array<T, 4> input =
48  MakeTensor<T, 4>(inputInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
49 
50  LayerTestResult<T, 4> result(outputInfo);
51  result.outputExpected =
52  MakeTensor<T, 4>(outputInfo, armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset));
53 
55  std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
56  std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
58 
60  AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
61  AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
62 
63  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDepthToSpace(descriptor, info);
64 
65  inputHandle->Allocate();
66  outputHandle->Allocate();
67 
68  CopyDataToITensorHandle(inputHandle.get(), input.origin());
69 
70  workload->Execute();
71 
72  CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
73  return result;
74 }
75 
76 } // anonymous namespace
77 
78 template<armnn::DataType ArmnnType, typename T>
80  armnn::IWorkloadFactory& workloadFactory,
82  armnn::DataLayout dataLayout)
83 {
84  unsigned int inputShape[] = { 1, 1, 1, 8 };
85  unsigned int outputShape[] = { 1, 2, 2, 2 };
86 
87  // in:
88  // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]]
89  //
90  // out:
91  // [[[[1, 2, 3], [4, 5, 6]],
92  // [[7, 8, 9], [10, 11, 12]]]]
93 
94  std::vector<float> input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
95  std::vector<float> expectedOutput = input;
96 
98  desc.m_Parameters.m_DataLayout = dataLayout;
99  desc.m_Parameters.m_BlockSize = 2;
100 
101  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
102  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
103 
104  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
105 }
106 
107 template<armnn::DataType ArmnnType, typename T>
109  armnn::IWorkloadFactory& workloadFactory,
111  armnn::DataLayout dataLayout)
112 {
113  unsigned int inputShape[] = { 1, 2, 2, 4 };
114  unsigned int outputShape[] = { 1, 4, 4, 1 };
115 
116  // in:
117  // [[[[1, 2, 3, 4],
118  // [5, 6, 7, 8]],
119  // [[9, 10, 11, 12],
120  // [13, 14, 15, 16]]]]
121  //
122  // out:
123  // [[[ [1], [2], [5], [6]],
124  // [ [3], [4], [7], [8]],
125  // [ [9], [10], [13], [14]],
126  // [ [11], [12], [15], [16]]]]
127 
128  std::vector<float> input =
129  {
130  1.f, 2.f, 3.f, 4.f,
131 
132  5.f, 6.f, 7.f, 8.f,
133 
134  9.f, 10.f, 11.f, 12.f,
135 
136  13.f, 14.f, 15.f, 16.f
137  };
138 
139  std::vector<float> expectedOutput
140  {
141  1.f, 2.f, 5.f, 6.f,
142  3.f, 4.f, 7.f, 8.f,
143  9.f, 10.f, 13.f, 14.f,
144  11.f, 12.f, 15.f, 16.f
145  };
146 
148  desc.m_Parameters.m_DataLayout = dataLayout;
149  desc.m_Parameters.m_BlockSize = 2;
150 
151  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
152  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
153 
154  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
155 }
156 
157 template<armnn::DataType ArmnnType, typename T>
159  armnn::IWorkloadFactory& workloadFactory,
161  armnn::DataLayout dataLayout)
162 {
163  unsigned int inputShape[] = { 2, 1, 1, 4 };
164  unsigned int outputShape[] = { 2, 2, 2, 1 };
165 
166  std::vector<float> input =
167  {
168  1.f, 2.f, 3.f, 4.f, // batch 0
169  5.f, 6.f, 7.f, 8.f // batch 1
170  };
171 
172  std::vector<float> expectedOutput = input;
173 
175  desc.m_Parameters.m_DataLayout = dataLayout;
176  desc.m_Parameters.m_BlockSize = 2;
177 
178  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
179  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
180 
181  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
182 }
183 
184 template<armnn::DataType ArmnnType, typename T>
186  armnn::IWorkloadFactory& workloadFactory,
188  armnn::DataLayout dataLayout)
189 {
190  unsigned int inputShape[] = { 2, 2, 2, 4 };
191  unsigned int outputShape[] = { 2, 4, 4, 1 };
192 
193  std::vector<float> input =
194  {
195  1.f, 2.f, 3.f, 4.f,
196 
197  5.f, 6.f, 7.f, 8.f,
198 
199  9.f, 10.f, 11.f, 12.f,
200 
201  13.f, 14.f, 15.f, 16.f,
202 
203 
204  17.f, 18.f, 19.f, 20.f,
205 
206  21.f, 22.f, 23.f, 24.f,
207 
208  25.f, 26.f, 27.f, 28.f,
209 
210  29.f, 30.f, 31.f, 32.f
211  };
212 
213  std::vector<float> expectedOutput
214  {
215  1.f, 2.f, 5.f, 6.f,
216  3.f, 4.f, 7.f, 8.f,
217  9.f, 10.f, 13.f, 14.f,
218  11.f, 12.f, 15.f, 16.f,
219 
220 
221  17.f, 18.f, 21.f, 22.f,
222  19.f, 20.f, 23.f, 24.f,
223  25.f, 26.f, 29.f, 30.f,
224  27.f, 28.f, 31.f, 32.f
225  };
226 
228  desc.m_Parameters.m_DataLayout = dataLayout;
229  desc.m_Parameters.m_BlockSize = 2;
230 
231  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
232  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
233 
234  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
235 }
236 
237 // Float32
239 DepthToSpaceTest1<armnn::DataType::Float32>(
240  armnn::IWorkloadFactory& workloadFactory,
242  armnn::DataLayout dataLayout);
243 
244 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
245 DepthToSpaceTest2<armnn::DataType::Float32>(
246  armnn::IWorkloadFactory& workloadFactory,
248  armnn::DataLayout dataLayout);
249 
250 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
251 DepthToSpaceTest3<armnn::DataType::Float32>(
252  armnn::IWorkloadFactory& workloadFactory,
254  armnn::DataLayout dataLayout);
255 
256 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
257 DepthToSpaceTest4<armnn::DataType::Float32>(
258  armnn::IWorkloadFactory& workloadFactory,
260  armnn::DataLayout dataLayout);
261 
262 // Float16
264 DepthToSpaceTest1<armnn::DataType::Float16>(
265  armnn::IWorkloadFactory& workloadFactory,
267  armnn::DataLayout dataLayout);
268 
269 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
270 DepthToSpaceTest2<armnn::DataType::Float16>(
271  armnn::IWorkloadFactory& workloadFactory,
273  armnn::DataLayout dataLayout);
274 
275 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
276 DepthToSpaceTest3<armnn::DataType::Float16>(
277  armnn::IWorkloadFactory& workloadFactory,
279  armnn::DataLayout dataLayout);
280 
281 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
282 DepthToSpaceTest4<armnn::DataType::Float16>(
283  armnn::IWorkloadFactory& workloadFactory,
285  armnn::DataLayout dataLayout);
286 
287 // QuantisedAsymm8
289 DepthToSpaceTest1<armnn::DataType::QAsymmU8>(
290  armnn::IWorkloadFactory& workloadFactory,
292  armnn::DataLayout dataLayout);
293 
294 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
295 DepthToSpaceTest2<armnn::DataType::QAsymmU8>(
296  armnn::IWorkloadFactory& workloadFactory,
298  armnn::DataLayout dataLayout);
299 
300 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
301 DepthToSpaceTest3<armnn::DataType::QAsymmU8>(
302  armnn::IWorkloadFactory& workloadFactory,
304  armnn::DataLayout dataLayout);
305 
306 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
307 DepthToSpaceTest4<armnn::DataType::QAsymmU8>(
308  armnn::IWorkloadFactory& workloadFactory,
310  armnn::DataLayout dataLayout);
311 
312 // QuantisedAsymmS8
314 DepthToSpaceTest1<armnn::DataType::QAsymmS8>(
315  armnn::IWorkloadFactory& workloadFactory,
317  armnn::DataLayout dataLayout);
318 
319 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
320 DepthToSpaceTest2<armnn::DataType::QAsymmS8>(
321  armnn::IWorkloadFactory& workloadFactory,
323  armnn::DataLayout dataLayout);
324 
325 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
326 DepthToSpaceTest3<armnn::DataType::QAsymmS8>(
327  armnn::IWorkloadFactory& workloadFactory,
329  armnn::DataLayout dataLayout);
330 
331 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
332 DepthToSpaceTest4<armnn::DataType::QAsymmS8>(
333  armnn::IWorkloadFactory& workloadFactory,
335  armnn::DataLayout dataLayout);
336 
337 // QuantisedSymm16
339 DepthToSpaceTest1<armnn::DataType::QSymmS16>(
340  armnn::IWorkloadFactory& workloadFactory,
342  armnn::DataLayout dataLayout);
343 
344 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
345 DepthToSpaceTest2<armnn::DataType::QSymmS16>(
346  armnn::IWorkloadFactory& workloadFactory,
348  armnn::DataLayout dataLayout);
349 
350 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
351 DepthToSpaceTest3<armnn::DataType::QSymmS16>(
352  armnn::IWorkloadFactory& workloadFactory,
354  armnn::DataLayout dataLayout);
355 
356 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
357 DepthToSpaceTest4<armnn::DataType::QSymmS16>(
358  armnn::IWorkloadFactory& workloadFactory,
360  armnn::DataLayout dataLayout);
DataLayout
Definition: Types.hpp:54
#define ARMNN_NO_DEPRECATE_WARN_BEGIN
Definition: Deprecated.hpp:33
void IgnoreUnused(Ts &&...)
LayerTestResult< T, 4 > DepthToSpaceTest3(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::DataLayout dataLayout)
LayerTestResult< T, 4 > DepthToSpaceTest4(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::DataLayout dataLayout)
#define ARMNN_NO_DEPRECATE_WARN_END
Definition: Deprecated.hpp:34
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:464
LayerTestResult< T, 4 > DepthToSpaceTest2(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::DataLayout dataLayout)
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const =0
unsigned int m_BlockSize
Scalar specifying the input block size. It must be >= 1.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
virtual std::unique_ptr< IWorkload > CreateDepthToSpace(const DepthToSpaceQueueDescriptor &descriptor, const WorkloadInfo &info) const
Contains information about inputs and outputs to a layer.
void SetQuantizationOffset(int32_t offset)
Definition: Tensor.cpp:480
LayerTestResult< T, 4 > DepthToSpaceTest1(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::DataLayout dataLayout)
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)