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