ArmNN
 22.05.01
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 
9 
10 
14 
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.CreateWorkload(armnn::LayerType::DepthToSpace,
62  descriptor,
63  info);
64 
65  inputHandle->Allocate();
66  outputHandle->Allocate();
67 
68  CopyDataToITensorHandle(inputHandle.get(), input.data());
69 
70  workload->Execute();
71 
72  CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
73 
74  return LayerTestResult<T, 4>(actualOutput,
75  expectedOutput,
76  outputHandle->GetShape(),
77  outputInfo.GetShape());
78 }
79 
80 } // anonymous namespace
81 
82 template<armnn::DataType ArmnnType, typename T>
84  armnn::IWorkloadFactory& workloadFactory,
86  armnn::DataLayout dataLayout)
87 {
88  unsigned int inputShape[] = { 1, 1, 1, 8 };
89  unsigned int outputShape[] = { 1, 2, 2, 2 };
90 
91  // in:
92  // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]]
93  //
94  // out:
95  // [[[[1, 2, 3], [4, 5, 6]],
96  // [[7, 8, 9], [10, 11, 12]]]]
97 
98  std::vector<float> input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
99  std::vector<float> expectedOutput = input;
100 
102  desc.m_Parameters.m_DataLayout = dataLayout;
103  desc.m_Parameters.m_BlockSize = 2;
104 
105  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
106  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
107 
108  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
109 }
110 
111 template<armnn::DataType ArmnnType, typename T>
113  armnn::IWorkloadFactory& workloadFactory,
115  armnn::DataLayout dataLayout)
116 {
117  unsigned int inputShape[] = { 1, 2, 2, 4 };
118  unsigned int outputShape[] = { 1, 4, 4, 1 };
119 
120  // in:
121  // [[[[1, 2, 3, 4],
122  // [5, 6, 7, 8]],
123  // [[9, 10, 11, 12],
124  // [13, 14, 15, 16]]]]
125  //
126  // out:
127  // [[[ [1], [2], [5], [6]],
128  // [ [3], [4], [7], [8]],
129  // [ [9], [10], [13], [14]],
130  // [ [11], [12], [15], [16]]]]
131 
132  std::vector<float> input =
133  {
134  1.f, 2.f, 3.f, 4.f,
135 
136  5.f, 6.f, 7.f, 8.f,
137 
138  9.f, 10.f, 11.f, 12.f,
139 
140  13.f, 14.f, 15.f, 16.f
141  };
142 
143  std::vector<float> expectedOutput
144  {
145  1.f, 2.f, 5.f, 6.f,
146  3.f, 4.f, 7.f, 8.f,
147  9.f, 10.f, 13.f, 14.f,
148  11.f, 12.f, 15.f, 16.f
149  };
150 
152  desc.m_Parameters.m_DataLayout = dataLayout;
153  desc.m_Parameters.m_BlockSize = 2;
154 
155  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
156  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
157 
158  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
159 }
160 
161 template<armnn::DataType ArmnnType, typename T>
163  armnn::IWorkloadFactory& workloadFactory,
165  armnn::DataLayout dataLayout)
166 {
167  unsigned int inputShape[] = { 2, 1, 1, 4 };
168  unsigned int outputShape[] = { 2, 2, 2, 1 };
169 
170  std::vector<float> input =
171  {
172  1.f, 2.f, 3.f, 4.f, // batch 0
173  5.f, 6.f, 7.f, 8.f // batch 1
174  };
175 
176  std::vector<float> expectedOutput = input;
177 
179  desc.m_Parameters.m_DataLayout = dataLayout;
180  desc.m_Parameters.m_BlockSize = 2;
181 
182  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
183  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
184 
185  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
186 }
187 
188 template<armnn::DataType ArmnnType, typename T>
190  armnn::IWorkloadFactory& workloadFactory,
192  armnn::DataLayout dataLayout)
193 {
194  unsigned int inputShape[] = { 2, 2, 2, 4 };
195  unsigned int outputShape[] = { 2, 4, 4, 1 };
196 
197  std::vector<float> input =
198  {
199  1.f, 2.f, 3.f, 4.f,
200 
201  5.f, 6.f, 7.f, 8.f,
202 
203  9.f, 10.f, 11.f, 12.f,
204 
205  13.f, 14.f, 15.f, 16.f,
206 
207 
208  17.f, 18.f, 19.f, 20.f,
209 
210  21.f, 22.f, 23.f, 24.f,
211 
212  25.f, 26.f, 27.f, 28.f,
213 
214  29.f, 30.f, 31.f, 32.f
215  };
216 
217  std::vector<float> expectedOutput
218  {
219  1.f, 2.f, 5.f, 6.f,
220  3.f, 4.f, 7.f, 8.f,
221  9.f, 10.f, 13.f, 14.f,
222  11.f, 12.f, 15.f, 16.f,
223 
224 
225  17.f, 18.f, 21.f, 22.f,
226  19.f, 20.f, 23.f, 24.f,
227  25.f, 26.f, 29.f, 30.f,
228  27.f, 28.f, 31.f, 32.f
229  };
230 
232  desc.m_Parameters.m_DataLayout = dataLayout;
233  desc.m_Parameters.m_BlockSize = 2;
234 
235  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
236  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
237 
238  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
239 }
240 
241 // Float32
243 DepthToSpaceTest1<armnn::DataType::Float32>(
244  armnn::IWorkloadFactory& workloadFactory,
246  armnn::DataLayout dataLayout);
247 
248 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
249 DepthToSpaceTest2<armnn::DataType::Float32>(
250  armnn::IWorkloadFactory& workloadFactory,
252  armnn::DataLayout dataLayout);
253 
254 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
255 DepthToSpaceTest3<armnn::DataType::Float32>(
256  armnn::IWorkloadFactory& workloadFactory,
258  armnn::DataLayout dataLayout);
259 
260 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
261 DepthToSpaceTest4<armnn::DataType::Float32>(
262  armnn::IWorkloadFactory& workloadFactory,
264  armnn::DataLayout dataLayout);
265 
266 // Float16
268 DepthToSpaceTest1<armnn::DataType::Float16>(
269  armnn::IWorkloadFactory& workloadFactory,
271  armnn::DataLayout dataLayout);
272 
273 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
274 DepthToSpaceTest2<armnn::DataType::Float16>(
275  armnn::IWorkloadFactory& workloadFactory,
277  armnn::DataLayout dataLayout);
278 
279 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
280 DepthToSpaceTest3<armnn::DataType::Float16>(
281  armnn::IWorkloadFactory& workloadFactory,
283  armnn::DataLayout dataLayout);
284 
285 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
286 DepthToSpaceTest4<armnn::DataType::Float16>(
287  armnn::IWorkloadFactory& workloadFactory,
289  armnn::DataLayout dataLayout);
290 
291 // QuantisedAsymm8
293 DepthToSpaceTest1<armnn::DataType::QAsymmU8>(
294  armnn::IWorkloadFactory& workloadFactory,
296  armnn::DataLayout dataLayout);
297 
298 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
299 DepthToSpaceTest2<armnn::DataType::QAsymmU8>(
300  armnn::IWorkloadFactory& workloadFactory,
302  armnn::DataLayout dataLayout);
303 
304 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
305 DepthToSpaceTest3<armnn::DataType::QAsymmU8>(
306  armnn::IWorkloadFactory& workloadFactory,
308  armnn::DataLayout dataLayout);
309 
310 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
311 DepthToSpaceTest4<armnn::DataType::QAsymmU8>(
312  armnn::IWorkloadFactory& workloadFactory,
314  armnn::DataLayout dataLayout);
315 
316 // QuantisedAsymmS8
318 DepthToSpaceTest1<armnn::DataType::QAsymmS8>(
319  armnn::IWorkloadFactory& workloadFactory,
321  armnn::DataLayout dataLayout);
322 
323 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
324 DepthToSpaceTest2<armnn::DataType::QAsymmS8>(
325  armnn::IWorkloadFactory& workloadFactory,
327  armnn::DataLayout dataLayout);
328 
329 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
330 DepthToSpaceTest3<armnn::DataType::QAsymmS8>(
331  armnn::IWorkloadFactory& workloadFactory,
333  armnn::DataLayout dataLayout);
334 
335 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
336 DepthToSpaceTest4<armnn::DataType::QAsymmS8>(
337  armnn::IWorkloadFactory& workloadFactory,
339  armnn::DataLayout dataLayout);
340 
341 // QuantisedSymm16
343 DepthToSpaceTest1<armnn::DataType::QSymmS16>(
344  armnn::IWorkloadFactory& workloadFactory,
346  armnn::DataLayout dataLayout);
347 
348 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
349 DepthToSpaceTest2<armnn::DataType::QSymmS16>(
350  armnn::IWorkloadFactory& workloadFactory,
352  armnn::DataLayout dataLayout);
353 
354 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
355 DepthToSpaceTest3<armnn::DataType::QSymmS16>(
356  armnn::IWorkloadFactory& workloadFactory,
358  armnn::DataLayout dataLayout);
359 
360 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
361 DepthToSpaceTest4<armnn::DataType::QSymmS16>(
362  armnn::IWorkloadFactory& workloadFactory,
364  armnn::DataLayout dataLayout);
DataLayout
Definition: Types.hpp:62
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 CopyDataFromITensorHandle(void *mem, const armnn::ITensorHandle *tensorHandle)
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:473
LayerTestResult< T, 4 > DepthToSpaceTest2(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::DataLayout dataLayout)
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).
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
Contains information about TensorInfos of a layer.
void SetQuantizationOffset(int32_t offset)
Definition: Tensor.cpp:489
LayerTestResult< T, 4 > DepthToSpaceTest1(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::DataLayout dataLayout)
virtual std::unique_ptr< IWorkload > CreateWorkload(LayerType type, const QueueDescriptor &descriptor, const WorkloadInfo &info) const
unsigned int GetNumElements() const
Definition: Tensor.hpp:196