blob: 9588f560ef98854ede61c9c0f004157924883b22 [file] [log] [blame]
Aron Virginas-Tar73f66422019-09-23 19:11:59 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "DepthToSpaceTestImpl.hpp"
7
8#include <Permute.hpp>
9
10#include <armnn/ArmNN.hpp>
11
12#include <backendsCommon/test/TensorCopyUtils.hpp>
13#include <backendsCommon/test/WorkloadTestUtils.hpp>
14
15#include <test/TensorHelpers.hpp>
16
17namespace
18{
19
20template<typename T>
21LayerTestResult<T, 4> DepthToSpaceTestImpl(
22 armnn::IWorkloadFactory& workloadFactory,
23 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
24 armnn::TensorInfo& inputInfo,
25 armnn::TensorInfo& outputInfo,
26 std::vector<float>& inputData,
27 std::vector<float>& expectedOutputData,
28 armnn::DepthToSpaceQueueDescriptor descriptor,
29 const float qScale = 1.0f,
30 const int32_t qOffset = 0)
31{
32 const armnn::PermutationVector permVector{0, 2, 3, 1};
33
34 if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW)
35 {
36 inputInfo = armnnUtils::Permuted(inputInfo, permVector);
37 outputInfo = armnnUtils::Permuted(outputInfo, permVector);
38
39 constexpr size_t typeSize = sizeof(float);
40
41 std::vector<float> inputTmp(inputData.size());
42 armnnUtils::Permute(inputInfo.GetShape(), permVector, inputData.data(), inputTmp.data(), typeSize);
43 inputData = inputTmp;
44
45 std::vector<float> outputTmp(expectedOutputData.size());
46 armnnUtils::Permute(outputInfo.GetShape(), permVector, expectedOutputData.data(), outputTmp.data(), typeSize);
47 expectedOutputData = outputTmp;
48 }
49
50 if(armnn::IsQuantizedType<T>())
51 {
52 inputInfo.SetQuantizationScale(qScale);
53 inputInfo.SetQuantizationOffset(qOffset);
54 outputInfo.SetQuantizationScale(qScale);
55 outputInfo.SetQuantizationOffset(qOffset);
56 }
57
58 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputInfo, QuantizedVector<T>(qScale, qOffset, inputData));
59
60 LayerTestResult<T, 4> result(outputInfo);
61 result.outputExpected = MakeTensor<T, 4>(outputInfo, QuantizedVector<T>(qScale, qOffset, expectedOutputData));
62
63 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
64 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
65
66 armnn::WorkloadInfo info;
67 AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
68 AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
69
70 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDepthToSpace(descriptor, info);
71
72 inputHandle->Allocate();
73 outputHandle->Allocate();
74
75 CopyDataToITensorHandle(inputHandle.get(), input.origin());
76
77 workload->Execute();
78
79 CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
80 return result;
81}
82
83} // anonymous namespace
84
85template<armnn::DataType ArmnnType, typename T>
86LayerTestResult<T, 4> DepthToSpaceTest1(
87 armnn::IWorkloadFactory& workloadFactory,
88 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
89 armnn::DataLayout dataLayout)
90{
91 unsigned int inputShape[] = { 1, 1, 1, 8 };
92 unsigned int outputShape[] = { 1, 2, 2, 2 };
93
94 // in:
95 // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]]
96 //
97 // out:
98 // [[[[1, 2, 3], [4, 5, 6]],
99 // [[7, 8, 9], [10, 11, 12]]]]
100
101 std::vector<float> input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
102 std::vector<float> expectedOutput = input;
103
104 armnn::DepthToSpaceQueueDescriptor desc;
105 desc.m_Parameters.m_DataLayout = dataLayout;
106 desc.m_Parameters.m_BlockSize = 2;
107
108 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
109 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
110
111 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
112}
113
114template<armnn::DataType ArmnnType, typename T>
115LayerTestResult<T, 4> DepthToSpaceTest2(
116 armnn::IWorkloadFactory& workloadFactory,
117 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
118 armnn::DataLayout dataLayout)
119{
120 unsigned int inputShape[] = { 1, 2, 2, 4 };
121 unsigned int outputShape[] = { 1, 4, 4, 1 };
122
123 // in:
124 // [[[[1, 2, 3, 4],
125 // [5, 6, 7, 8]],
126 // [[9, 10, 11, 12],
127 // [13, 14, 15, 16]]]]
128 //
129 // out:
130 // [[[ [1], [2], [5], [6]],
131 // [ [3], [4], [7], [8]],
132 // [ [9], [10], [13], [14]],
133 // [ [11], [12], [15], [16]]]]
134
135 std::vector<float> input =
136 {
137 1.f, 2.f, 3.f, 4.f,
138
139 5.f, 6.f, 7.f, 8.f,
140
141 9.f, 10.f, 11.f, 12.f,
142
143 13.f, 14.f, 15.f, 16.f
144 };
145
146 std::vector<float> expectedOutput
147 {
148 1.f, 2.f, 5.f, 6.f,
149 3.f, 4.f, 7.f, 8.f,
150 9.f, 10.f, 13.f, 14.f,
151 11.f, 12.f, 15.f, 16.f
152 };
153
154 armnn::DepthToSpaceQueueDescriptor desc;
155 desc.m_Parameters.m_DataLayout = dataLayout;
156 desc.m_Parameters.m_BlockSize = 2;
157
158 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
159 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
160
161 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
162}
163
164template<armnn::DataType ArmnnType, typename T>
165LayerTestResult<T, 4> DepthToSpaceTest3(
166 armnn::IWorkloadFactory& workloadFactory,
167 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
168 armnn::DataLayout dataLayout)
169{
170 unsigned int inputShape[] = { 2, 1, 1, 4 };
171 unsigned int outputShape[] = { 2, 2, 2, 1 };
172
173 std::vector<float> input =
174 {
175 1.f, 2.f, 3.f, 4.f, // batch 0
176 5.f, 6.f, 7.f, 8.f // batch 1
177 };
178
179 std::vector<float> expectedOutput = input;
180
181 armnn::DepthToSpaceQueueDescriptor desc;
182 desc.m_Parameters.m_DataLayout = dataLayout;
183 desc.m_Parameters.m_BlockSize = 2;
184
185 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
186 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
187
188 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
189}
190
191template<armnn::DataType ArmnnType, typename T>
192LayerTestResult<T, 4> DepthToSpaceTest4(
193 armnn::IWorkloadFactory& workloadFactory,
194 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
195 armnn::DataLayout dataLayout)
196{
197 unsigned int inputShape[] = { 2, 2, 2, 4 };
198 unsigned int outputShape[] = { 2, 4, 4, 1 };
199
200 std::vector<float> input =
201 {
202 1.f, 2.f, 3.f, 4.f,
203
204 5.f, 6.f, 7.f, 8.f,
205
206 9.f, 10.f, 11.f, 12.f,
207
208 13.f, 14.f, 15.f, 16.f,
209
210
211 17.f, 18.f, 19.f, 20.f,
212
213 21.f, 22.f, 23.f, 24.f,
214
215 25.f, 26.f, 27.f, 28.f,
216
217 29.f, 30.f, 31.f, 32.f
218 };
219
220 std::vector<float> expectedOutput
221 {
222 1.f, 2.f, 5.f, 6.f,
223 3.f, 4.f, 7.f, 8.f,
224 9.f, 10.f, 13.f, 14.f,
225 11.f, 12.f, 15.f, 16.f,
226
227
228 17.f, 18.f, 21.f, 22.f,
229 19.f, 20.f, 23.f, 24.f,
230 25.f, 26.f, 29.f, 30.f,
231 27.f, 28.f, 31.f, 32.f
232 };
233
234 armnn::DepthToSpaceQueueDescriptor desc;
235 desc.m_Parameters.m_DataLayout = dataLayout;
236 desc.m_Parameters.m_BlockSize = 2;
237
238 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
239 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
240
241 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
242}
243
244// Float32
245template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
246DepthToSpaceTest1<armnn::DataType::Float32>(
247 armnn::IWorkloadFactory& workloadFactory,
248 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
249 armnn::DataLayout dataLayout);
250
251template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
252DepthToSpaceTest2<armnn::DataType::Float32>(
253 armnn::IWorkloadFactory& workloadFactory,
254 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
255 armnn::DataLayout dataLayout);
256
257template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
258DepthToSpaceTest3<armnn::DataType::Float32>(
259 armnn::IWorkloadFactory& workloadFactory,
260 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
261 armnn::DataLayout dataLayout);
262
263template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
264DepthToSpaceTest4<armnn::DataType::Float32>(
265 armnn::IWorkloadFactory& workloadFactory,
266 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
267 armnn::DataLayout dataLayout);
268
269// Float16
270template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
271DepthToSpaceTest1<armnn::DataType::Float16>(
272 armnn::IWorkloadFactory& workloadFactory,
273 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
274 armnn::DataLayout dataLayout);
275
276template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
277DepthToSpaceTest2<armnn::DataType::Float16>(
278 armnn::IWorkloadFactory& workloadFactory,
279 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
280 armnn::DataLayout dataLayout);
281
282template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
283DepthToSpaceTest3<armnn::DataType::Float16>(
284 armnn::IWorkloadFactory& workloadFactory,
285 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
286 armnn::DataLayout dataLayout);
287
288template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
289DepthToSpaceTest4<armnn::DataType::Float16>(
290 armnn::IWorkloadFactory& workloadFactory,
291 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
292 armnn::DataLayout dataLayout);
293
294// QuantisedAsymm8
295template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
296DepthToSpaceTest1<armnn::DataType::QuantisedAsymm8>(
297 armnn::IWorkloadFactory& workloadFactory,
298 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
299 armnn::DataLayout dataLayout);
300
301template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
302DepthToSpaceTest2<armnn::DataType::QuantisedAsymm8>(
303 armnn::IWorkloadFactory& workloadFactory,
304 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
305 armnn::DataLayout dataLayout);
306
307template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
308DepthToSpaceTest3<armnn::DataType::QuantisedAsymm8>(
309 armnn::IWorkloadFactory& workloadFactory,
310 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
311 armnn::DataLayout dataLayout);
312
313template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
314DepthToSpaceTest4<armnn::DataType::QuantisedAsymm8>(
315 armnn::IWorkloadFactory& workloadFactory,
316 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
317 armnn::DataLayout dataLayout);
318
319// QuantisedSymm16
320template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
321DepthToSpaceTest1<armnn::DataType::QuantisedSymm16>(
322 armnn::IWorkloadFactory& workloadFactory,
323 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
324 armnn::DataLayout dataLayout);
325
326template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
327DepthToSpaceTest2<armnn::DataType::QuantisedSymm16>(
328 armnn::IWorkloadFactory& workloadFactory,
329 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
330 armnn::DataLayout dataLayout);
331
332template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
333DepthToSpaceTest3<armnn::DataType::QuantisedSymm16>(
334 armnn::IWorkloadFactory& workloadFactory,
335 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
336 armnn::DataLayout dataLayout);
337
338template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
339DepthToSpaceTest4<armnn::DataType::QuantisedSymm16>(
340 armnn::IWorkloadFactory& workloadFactory,
341 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
342 armnn::DataLayout dataLayout);