ArmNN
 20.05
SpaceToDepthTestImpl.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
7 
8 #include <QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10 
11 
12 #include <armnnUtils/Permute.hpp>
13 
16 
17 #include <test/TensorHelpers.hpp>
18 
19 namespace
20 {
21 
22 template<typename T>
23 LayerTestResult<T, 4> SpaceToDepthTestImpl(
24  armnn::IWorkloadFactory& workloadFactory,
26  armnn::TensorInfo& inputTensorInfo,
27  armnn::TensorInfo& outputTensorInfo,
28  std::vector<float>& inputData,
29  std::vector<float>& outputExpectedData,
31  const float qScale = 1.0f,
32  const int32_t qOffset = 0)
33 {
34  IgnoreUnused(memoryManager);
35  const armnn::PermutationVector NHWCToNCHW = {0, 2, 3, 1};
36 
38  {
39  inputTensorInfo = armnnUtils::Permuted(inputTensorInfo, NHWCToNCHW);
40  outputTensorInfo = armnnUtils::Permuted(outputTensorInfo, NHWCToNCHW);
41 
42  std::vector<float> inputTmp(inputData.size());
43  armnnUtils::Permute(inputTensorInfo.GetShape(), NHWCToNCHW,
44  inputData.data(), inputTmp.data(), sizeof(float));
45  inputData = inputTmp;
46 
47  std::vector<float> outputTmp(outputExpectedData.size());
48  armnnUtils::Permute(outputTensorInfo.GetShape(), NHWCToNCHW,
49  outputExpectedData.data(), outputTmp.data(), sizeof(float));
50  outputExpectedData = outputTmp;
51  }
52 
53  if(armnn::IsQuantizedType<T>())
54  {
55  inputTensorInfo.SetQuantizationScale(qScale);
56  inputTensorInfo.SetQuantizationOffset(qOffset);
57  outputTensorInfo.SetQuantizationScale(qScale);
58  outputTensorInfo.SetQuantizationOffset(qOffset);
59  }
60 
61  boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputTensorInfo,
62  armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
63 
64  LayerTestResult<T, 4> ret(outputTensorInfo);
65  ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo,
66  armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset));
67 
68  std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
69  std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
70 
72  AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
73  AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
74 
75  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSpaceToDepth(descriptor, info);
76 
77  inputHandle->Allocate();
78  outputHandle->Allocate();
79 
80  CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
81 
82  workload->Execute();
83 
84  CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
85 
86  return ret;
87 }
88 
89 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
90 LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
91  armnn::IWorkloadFactory& workloadFactory,
94 {
95  unsigned int inputShape[] = {1, 2, 2, 1};
96  unsigned int outputShape[] = {1, 1, 1, 4};
97 
98  std::vector<float> input = std::vector<float>(
99  {
100  1.0f, 2.0f, 3.0f, 4.0f
101  });
102 
103  std::vector<float> outputExpected = std::vector<float>(
104  {
105  1.0f, 2.0f, 3.0f, 4.0f
106  });
107 
108  armnn::TensorInfo inputTensorInfo;
109  armnn::TensorInfo outputTensorInfo;
110 
112  desc.m_Parameters.m_DataLayout = dataLayout;
113  desc.m_Parameters.m_BlockSize = 2;
114 
115  inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
116  outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
117 
118  return SpaceToDepthTestImpl<T>(
119  workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
120 }
121 
122 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
123 LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
124  armnn::IWorkloadFactory& workloadFactory,
127 {
128  unsigned int inputShape[] = {1, 2, 2, 2};
129  unsigned int outputShape[] = {1, 1, 1, 8};
130 
131  std::vector<float> input = std::vector<float>(
132  {
133  1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
134  });
135 
136  std::vector<float> outputExpected = std::vector<float>(
137  {
138  1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
139  });
140 
141  armnn::TensorInfo inputTensorInfo;
142  armnn::TensorInfo outputTensorInfo;
143 
145  desc.m_Parameters.m_DataLayout = dataLayout;
146  desc.m_Parameters.m_BlockSize = 2;
147 
148  inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
149  outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
150 
151  return SpaceToDepthTestImpl<T>(
152  workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
153 }
154 
155 } // anonymous namespace
156 
158  armnn::IWorkloadFactory& workloadFactory,
160 {
161  return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
162  workloadFactory,
163  memoryManager);
164 }
165 
167  armnn::IWorkloadFactory& workloadFactory,
169 {
170  return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
171  workloadFactory,
172  memoryManager,
174 }
175 
177  armnn::IWorkloadFactory& workloadFactory,
179 {
180  return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
181  workloadFactory,
182  memoryManager);
183 }
184 
186  armnn::IWorkloadFactory& workloadFactory,
188 {
189  return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
190  workloadFactory,
191  memoryManager,
193 }
194 
196  armnn::IWorkloadFactory& workloadFactory,
198 {
199  return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
200  workloadFactory,
201  memoryManager);
202 }
203 
205  armnn::IWorkloadFactory& workloadFactory,
207 {
208  return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
209  workloadFactory,
210  memoryManager,
212 }
213 
215  armnn::IWorkloadFactory& workloadFactory,
217 {
218  return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
219  workloadFactory,
220  memoryManager);
221 }
222 
224  armnn::IWorkloadFactory& workloadFactory,
226 {
227  return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
228  workloadFactory,
229  memoryManager,
231 }
232 
234  armnn::IWorkloadFactory& workloadFactory,
236 {
237  return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
238  workloadFactory,
239  memoryManager);
240 }
241 
243  armnn::IWorkloadFactory& workloadFactory,
245 {
246  return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
247  workloadFactory,
248  memoryManager,
250 }
DataLayout
Definition: Types.hpp:49
const TensorShape & GetShape() const
Definition: Tensor.hpp:88
LayerTestResult< float, 4 > SpaceToDepthNhwcFloat32Test2(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 4 > SpaceToDepthNhwcFloat32Test1(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 4 > SpaceToDepthNchwFloat32Test2(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
void IgnoreUnused(Ts &&...)
LayerTestResult< int16_t, 4 > SpaceToDepthNhwcQSymm16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
void Permute(const armnn::TensorShape &dstShape, const armnn::PermutationVector &mappings, const void *src, void *dst, size_t dataTypeSize)
Definition: Permute.cpp:121
LayerTestResult< armnn::Half, 4 > SpaceToDepthNchwFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 4 > SpaceToDepthNchwFloat32Test1(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:260
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
LayerTestResult< armnn::Half, 4 > SpaceToDepthNhwcFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
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.
virtual std::unique_ptr< IWorkload > CreateSpaceToDepth(const SpaceToDepthQueueDescriptor &descriptor, const WorkloadInfo &info) const
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
LayerTestResult< int16_t, 4 > SpaceToDepthNchwQSymm16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< uint8_t, 4 > SpaceToDepthNhwcAsymmQ8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
Contains information about inputs and outputs to a layer.
void SetQuantizationOffset(int32_t offset)
Definition: Tensor.cpp:276
armnn::TensorShape Permuted(const armnn::TensorShape &srcShape, const armnn::PermutationVector &mappings)
Definition: Permute.cpp:98
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
LayerTestResult< uint8_t, 4 > SpaceToDepthNchwAsymmQ8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)