ArmNN
 20.02
DepthToSpaceTestImpl.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2019 Arm Ltd. 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 
54  std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
55  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.origin());
67 
68  workload->Execute();
69 
70  CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
71  return result;
72 }
73 
74 } // anonymous namespace
75 
76 template<armnn::DataType ArmnnType, typename T>
78  armnn::IWorkloadFactory& workloadFactory,
80  armnn::DataLayout dataLayout)
81 {
82  unsigned int inputShape[] = { 1, 1, 1, 8 };
83  unsigned int outputShape[] = { 1, 2, 2, 2 };
84 
85  // in:
86  // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]]
87  //
88  // out:
89  // [[[[1, 2, 3], [4, 5, 6]],
90  // [[7, 8, 9], [10, 11, 12]]]]
91 
92  std::vector<float> input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
93  std::vector<float> expectedOutput = input;
94 
96  desc.m_Parameters.m_DataLayout = dataLayout;
97  desc.m_Parameters.m_BlockSize = 2;
98 
99  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
100  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
101 
102  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
103 }
104 
105 template<armnn::DataType ArmnnType, typename T>
107  armnn::IWorkloadFactory& workloadFactory,
109  armnn::DataLayout dataLayout)
110 {
111  unsigned int inputShape[] = { 1, 2, 2, 4 };
112  unsigned int outputShape[] = { 1, 4, 4, 1 };
113 
114  // in:
115  // [[[[1, 2, 3, 4],
116  // [5, 6, 7, 8]],
117  // [[9, 10, 11, 12],
118  // [13, 14, 15, 16]]]]
119  //
120  // out:
121  // [[[ [1], [2], [5], [6]],
122  // [ [3], [4], [7], [8]],
123  // [ [9], [10], [13], [14]],
124  // [ [11], [12], [15], [16]]]]
125 
126  std::vector<float> input =
127  {
128  1.f, 2.f, 3.f, 4.f,
129 
130  5.f, 6.f, 7.f, 8.f,
131 
132  9.f, 10.f, 11.f, 12.f,
133 
134  13.f, 14.f, 15.f, 16.f
135  };
136 
137  std::vector<float> expectedOutput
138  {
139  1.f, 2.f, 5.f, 6.f,
140  3.f, 4.f, 7.f, 8.f,
141  9.f, 10.f, 13.f, 14.f,
142  11.f, 12.f, 15.f, 16.f
143  };
144 
146  desc.m_Parameters.m_DataLayout = dataLayout;
147  desc.m_Parameters.m_BlockSize = 2;
148 
149  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
150  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
151 
152  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
153 }
154 
155 template<armnn::DataType ArmnnType, typename T>
157  armnn::IWorkloadFactory& workloadFactory,
159  armnn::DataLayout dataLayout)
160 {
161  unsigned int inputShape[] = { 2, 1, 1, 4 };
162  unsigned int outputShape[] = { 2, 2, 2, 1 };
163 
164  std::vector<float> input =
165  {
166  1.f, 2.f, 3.f, 4.f, // batch 0
167  5.f, 6.f, 7.f, 8.f // batch 1
168  };
169 
170  std::vector<float> expectedOutput = input;
171 
173  desc.m_Parameters.m_DataLayout = dataLayout;
174  desc.m_Parameters.m_BlockSize = 2;
175 
176  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
177  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
178 
179  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
180 }
181 
182 template<armnn::DataType ArmnnType, typename T>
184  armnn::IWorkloadFactory& workloadFactory,
186  armnn::DataLayout dataLayout)
187 {
188  unsigned int inputShape[] = { 2, 2, 2, 4 };
189  unsigned int outputShape[] = { 2, 4, 4, 1 };
190 
191  std::vector<float> input =
192  {
193  1.f, 2.f, 3.f, 4.f,
194 
195  5.f, 6.f, 7.f, 8.f,
196 
197  9.f, 10.f, 11.f, 12.f,
198 
199  13.f, 14.f, 15.f, 16.f,
200 
201 
202  17.f, 18.f, 19.f, 20.f,
203 
204  21.f, 22.f, 23.f, 24.f,
205 
206  25.f, 26.f, 27.f, 28.f,
207 
208  29.f, 30.f, 31.f, 32.f
209  };
210 
211  std::vector<float> expectedOutput
212  {
213  1.f, 2.f, 5.f, 6.f,
214  3.f, 4.f, 7.f, 8.f,
215  9.f, 10.f, 13.f, 14.f,
216  11.f, 12.f, 15.f, 16.f,
217 
218 
219  17.f, 18.f, 21.f, 22.f,
220  19.f, 20.f, 23.f, 24.f,
221  25.f, 26.f, 29.f, 30.f,
222  27.f, 28.f, 31.f, 32.f
223  };
224 
226  desc.m_Parameters.m_DataLayout = dataLayout;
227  desc.m_Parameters.m_BlockSize = 2;
228 
229  armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
230  armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
231 
232  return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
233 }
234 
235 // Float32
237 DepthToSpaceTest1<armnn::DataType::Float32>(
238  armnn::IWorkloadFactory& workloadFactory,
240  armnn::DataLayout dataLayout);
241 
242 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
243 DepthToSpaceTest2<armnn::DataType::Float32>(
244  armnn::IWorkloadFactory& workloadFactory,
246  armnn::DataLayout dataLayout);
247 
248 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
249 DepthToSpaceTest3<armnn::DataType::Float32>(
250  armnn::IWorkloadFactory& workloadFactory,
252  armnn::DataLayout dataLayout);
253 
254 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
255 DepthToSpaceTest4<armnn::DataType::Float32>(
256  armnn::IWorkloadFactory& workloadFactory,
258  armnn::DataLayout dataLayout);
259 
260 // Float16
262 DepthToSpaceTest1<armnn::DataType::Float16>(
263  armnn::IWorkloadFactory& workloadFactory,
265  armnn::DataLayout dataLayout);
266 
267 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
268 DepthToSpaceTest2<armnn::DataType::Float16>(
269  armnn::IWorkloadFactory& workloadFactory,
271  armnn::DataLayout dataLayout);
272 
273 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
274 DepthToSpaceTest3<armnn::DataType::Float16>(
275  armnn::IWorkloadFactory& workloadFactory,
277  armnn::DataLayout dataLayout);
278 
279 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
280 DepthToSpaceTest4<armnn::DataType::Float16>(
281  armnn::IWorkloadFactory& workloadFactory,
283  armnn::DataLayout dataLayout);
284 
285 // QuantisedAsymm8
287 DepthToSpaceTest1<armnn::DataType::QAsymmU8>(
288  armnn::IWorkloadFactory& workloadFactory,
290  armnn::DataLayout dataLayout);
291 
292 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
293 DepthToSpaceTest2<armnn::DataType::QAsymmU8>(
294  armnn::IWorkloadFactory& workloadFactory,
296  armnn::DataLayout dataLayout);
297 
298 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
299 DepthToSpaceTest3<armnn::DataType::QAsymmU8>(
300  armnn::IWorkloadFactory& workloadFactory,
302  armnn::DataLayout dataLayout);
303 
304 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
305 DepthToSpaceTest4<armnn::DataType::QAsymmU8>(
306  armnn::IWorkloadFactory& workloadFactory,
308  armnn::DataLayout dataLayout);
309 
310 // QuantisedSymm16
312 DepthToSpaceTest1<armnn::DataType::QSymmS16>(
313  armnn::IWorkloadFactory& workloadFactory,
315  armnn::DataLayout dataLayout);
316 
317 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
318 DepthToSpaceTest2<armnn::DataType::QSymmS16>(
319  armnn::IWorkloadFactory& workloadFactory,
321  armnn::DataLayout dataLayout);
322 
323 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
324 DepthToSpaceTest3<armnn::DataType::QSymmS16>(
325  armnn::IWorkloadFactory& workloadFactory,
327  armnn::DataLayout dataLayout);
328 
329 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
330 DepthToSpaceTest4<armnn::DataType::QSymmS16>(
331  armnn::IWorkloadFactory& workloadFactory,
333  armnn::DataLayout dataLayout);
DataLayout
Definition: Types.hpp:49
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)
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:259
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:275
LayerTestResult< T, 4 > DepthToSpaceTest1(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::DataLayout dataLayout)
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)