ArmNN
 21.11
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  std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
48 
49  std::vector<T> actualOutput(outputInfo.GetNumElements());
50  std::vector<T> expectedOutput = armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset);
51 
53  std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
54  std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
56 
58  AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
59  AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
60 
61  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDepthToSpace(descriptor, info);
62 
63  inputHandle->Allocate();
64  outputHandle->Allocate();
65 
66  CopyDataToITensorHandle(inputHandle.get(), input.data());
67 
68  workload->Execute();
69 
70  CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
71 
72  return LayerTestResult<T, 4>(actualOutput,
73  expectedOutput,
74  outputHandle->GetShape(),
75  outputInfo.GetShape());
76 }
77 
78 } // anonymous namespace
79 
80 template<armnn::DataType ArmnnType, typename T>
82  armnn::IWorkloadFactory& workloadFactory,
84  armnn::DataLayout dataLayout)
85 {
86  unsigned int inputShape[] = { 1, 1, 1, 8 };
87  unsigned int outputShape[] = { 1, 2, 2, 2 };
88 
89  // in:
90  // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]]
91  //
92  // out:
93  // [[[[1, 2, 3], [4, 5, 6]],
94  // [[7, 8, 9], [10, 11, 12]]]]
95 
96  std::vector<float> input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
97  std::vector<float> expectedOutput = input;
98 
100  desc.m_Parameters.m_DataLayout = dataLayout;
101  desc.m_Parameters.m_BlockSize = 2;
102 
103  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
104  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
105 
106  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
107 }
108 
109 template<armnn::DataType ArmnnType, typename T>
111  armnn::IWorkloadFactory& workloadFactory,
113  armnn::DataLayout dataLayout)
114 {
115  unsigned int inputShape[] = { 1, 2, 2, 4 };
116  unsigned int outputShape[] = { 1, 4, 4, 1 };
117 
118  // in:
119  // [[[[1, 2, 3, 4],
120  // [5, 6, 7, 8]],
121  // [[9, 10, 11, 12],
122  // [13, 14, 15, 16]]]]
123  //
124  // out:
125  // [[[ [1], [2], [5], [6]],
126  // [ [3], [4], [7], [8]],
127  // [ [9], [10], [13], [14]],
128  // [ [11], [12], [15], [16]]]]
129 
130  std::vector<float> input =
131  {
132  1.f, 2.f, 3.f, 4.f,
133 
134  5.f, 6.f, 7.f, 8.f,
135 
136  9.f, 10.f, 11.f, 12.f,
137 
138  13.f, 14.f, 15.f, 16.f
139  };
140 
141  std::vector<float> expectedOutput
142  {
143  1.f, 2.f, 5.f, 6.f,
144  3.f, 4.f, 7.f, 8.f,
145  9.f, 10.f, 13.f, 14.f,
146  11.f, 12.f, 15.f, 16.f
147  };
148 
150  desc.m_Parameters.m_DataLayout = dataLayout;
151  desc.m_Parameters.m_BlockSize = 2;
152 
153  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
154  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
155 
156  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
157 }
158 
159 template<armnn::DataType ArmnnType, typename T>
161  armnn::IWorkloadFactory& workloadFactory,
163  armnn::DataLayout dataLayout)
164 {
165  unsigned int inputShape[] = { 2, 1, 1, 4 };
166  unsigned int outputShape[] = { 2, 2, 2, 1 };
167 
168  std::vector<float> input =
169  {
170  1.f, 2.f, 3.f, 4.f, // batch 0
171  5.f, 6.f, 7.f, 8.f // batch 1
172  };
173 
174  std::vector<float> expectedOutput = input;
175 
177  desc.m_Parameters.m_DataLayout = dataLayout;
178  desc.m_Parameters.m_BlockSize = 2;
179 
180  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
181  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
182 
183  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
184 }
185 
186 template<armnn::DataType ArmnnType, typename T>
188  armnn::IWorkloadFactory& workloadFactory,
190  armnn::DataLayout dataLayout)
191 {
192  unsigned int inputShape[] = { 2, 2, 2, 4 };
193  unsigned int outputShape[] = { 2, 4, 4, 1 };
194 
195  std::vector<float> input =
196  {
197  1.f, 2.f, 3.f, 4.f,
198 
199  5.f, 6.f, 7.f, 8.f,
200 
201  9.f, 10.f, 11.f, 12.f,
202 
203  13.f, 14.f, 15.f, 16.f,
204 
205 
206  17.f, 18.f, 19.f, 20.f,
207 
208  21.f, 22.f, 23.f, 24.f,
209 
210  25.f, 26.f, 27.f, 28.f,
211 
212  29.f, 30.f, 31.f, 32.f
213  };
214 
215  std::vector<float> expectedOutput
216  {
217  1.f, 2.f, 5.f, 6.f,
218  3.f, 4.f, 7.f, 8.f,
219  9.f, 10.f, 13.f, 14.f,
220  11.f, 12.f, 15.f, 16.f,
221 
222 
223  17.f, 18.f, 21.f, 22.f,
224  19.f, 20.f, 23.f, 24.f,
225  25.f, 26.f, 29.f, 30.f,
226  27.f, 28.f, 31.f, 32.f
227  };
228 
230  desc.m_Parameters.m_DataLayout = dataLayout;
231  desc.m_Parameters.m_BlockSize = 2;
232 
233  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
234  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
235 
236  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
237 }
238 
239 // Float32
241 DepthToSpaceTest1<armnn::DataType::Float32>(
242  armnn::IWorkloadFactory& workloadFactory,
244  armnn::DataLayout dataLayout);
245 
246 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
247 DepthToSpaceTest2<armnn::DataType::Float32>(
248  armnn::IWorkloadFactory& workloadFactory,
250  armnn::DataLayout dataLayout);
251 
252 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
253 DepthToSpaceTest3<armnn::DataType::Float32>(
254  armnn::IWorkloadFactory& workloadFactory,
256  armnn::DataLayout dataLayout);
257 
258 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
259 DepthToSpaceTest4<armnn::DataType::Float32>(
260  armnn::IWorkloadFactory& workloadFactory,
262  armnn::DataLayout dataLayout);
263 
264 // Float16
266 DepthToSpaceTest1<armnn::DataType::Float16>(
267  armnn::IWorkloadFactory& workloadFactory,
269  armnn::DataLayout dataLayout);
270 
271 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
272 DepthToSpaceTest2<armnn::DataType::Float16>(
273  armnn::IWorkloadFactory& workloadFactory,
275  armnn::DataLayout dataLayout);
276 
277 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
278 DepthToSpaceTest3<armnn::DataType::Float16>(
279  armnn::IWorkloadFactory& workloadFactory,
281  armnn::DataLayout dataLayout);
282 
283 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
284 DepthToSpaceTest4<armnn::DataType::Float16>(
285  armnn::IWorkloadFactory& workloadFactory,
287  armnn::DataLayout dataLayout);
288 
289 // QuantisedAsymm8
291 DepthToSpaceTest1<armnn::DataType::QAsymmU8>(
292  armnn::IWorkloadFactory& workloadFactory,
294  armnn::DataLayout dataLayout);
295 
296 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
297 DepthToSpaceTest2<armnn::DataType::QAsymmU8>(
298  armnn::IWorkloadFactory& workloadFactory,
300  armnn::DataLayout dataLayout);
301 
302 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
303 DepthToSpaceTest3<armnn::DataType::QAsymmU8>(
304  armnn::IWorkloadFactory& workloadFactory,
306  armnn::DataLayout dataLayout);
307 
308 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
309 DepthToSpaceTest4<armnn::DataType::QAsymmU8>(
310  armnn::IWorkloadFactory& workloadFactory,
312  armnn::DataLayout dataLayout);
313 
314 // QuantisedAsymmS8
316 DepthToSpaceTest1<armnn::DataType::QAsymmS8>(
317  armnn::IWorkloadFactory& workloadFactory,
319  armnn::DataLayout dataLayout);
320 
321 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
322 DepthToSpaceTest2<armnn::DataType::QAsymmS8>(
323  armnn::IWorkloadFactory& workloadFactory,
325  armnn::DataLayout dataLayout);
326 
327 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
328 DepthToSpaceTest3<armnn::DataType::QAsymmS8>(
329  armnn::IWorkloadFactory& workloadFactory,
331  armnn::DataLayout dataLayout);
332 
333 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
334 DepthToSpaceTest4<armnn::DataType::QAsymmS8>(
335  armnn::IWorkloadFactory& workloadFactory,
337  armnn::DataLayout dataLayout);
338 
339 // QuantisedSymm16
341 DepthToSpaceTest1<armnn::DataType::QSymmS16>(
342  armnn::IWorkloadFactory& workloadFactory,
344  armnn::DataLayout dataLayout);
345 
346 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
347 DepthToSpaceTest2<armnn::DataType::QSymmS16>(
348  armnn::IWorkloadFactory& workloadFactory,
350  armnn::DataLayout dataLayout);
351 
352 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
353 DepthToSpaceTest3<armnn::DataType::QSymmS16>(
354  armnn::IWorkloadFactory& workloadFactory,
356  armnn::DataLayout dataLayout);
357 
358 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
359 DepthToSpaceTest4<armnn::DataType::QSymmS16>(
360  armnn::IWorkloadFactory& workloadFactory,
362  armnn::DataLayout dataLayout);
DataLayout
Definition: Types.hpp:49
const TensorShape & GetShape() const
Definition: Tensor.hpp:191
#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:475
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 TensorInfos of a layer.
void SetQuantizationOffset(int32_t offset)
Definition: Tensor.cpp:491
LayerTestResult< T, 4 > DepthToSpaceTest1(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::DataLayout dataLayout)
unsigned int GetNumElements() const
Definition: Tensor.hpp:196
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)