ArmNN
 20.08
SpaceToDepthTestImpl.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. 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 
69  std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
70  std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
72 
74  AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
75  AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
76 
77  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSpaceToDepth(descriptor, info);
78 
79  inputHandle->Allocate();
80  outputHandle->Allocate();
81 
82  CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
83 
84  workload->Execute();
85 
86  CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
87 
88  return ret;
89 }
90 
91 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
92 LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
93  armnn::IWorkloadFactory& workloadFactory,
96 {
97  unsigned int inputShape[] = {1, 2, 2, 1};
98  unsigned int outputShape[] = {1, 1, 1, 4};
99 
100  std::vector<float> input = std::vector<float>(
101  {
102  1.0f, 2.0f, 3.0f, 4.0f
103  });
104 
105  std::vector<float> outputExpected = std::vector<float>(
106  {
107  1.0f, 2.0f, 3.0f, 4.0f
108  });
109 
110  armnn::TensorInfo inputTensorInfo;
111  armnn::TensorInfo outputTensorInfo;
112 
114  desc.m_Parameters.m_DataLayout = dataLayout;
115  desc.m_Parameters.m_BlockSize = 2;
116 
117  inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
118  outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
119 
120  return SpaceToDepthTestImpl<T>(
121  workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
122 }
123 
124 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
125 LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
126  armnn::IWorkloadFactory& workloadFactory,
129 {
130  unsigned int inputShape[] = {1, 2, 2, 2};
131  unsigned int outputShape[] = {1, 1, 1, 8};
132 
133  std::vector<float> input = std::vector<float>(
134  {
135  1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
136  });
137 
138  std::vector<float> outputExpected = std::vector<float>(
139  {
140  1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
141  });
142 
143  armnn::TensorInfo inputTensorInfo;
144  armnn::TensorInfo outputTensorInfo;
145 
147  desc.m_Parameters.m_DataLayout = dataLayout;
148  desc.m_Parameters.m_BlockSize = 2;
149 
150  inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
151  outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
152 
153  return SpaceToDepthTestImpl<T>(
154  workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
155 }
156 
157 } // anonymous namespace
158 
160  armnn::IWorkloadFactory& workloadFactory,
162 {
163  return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
164  workloadFactory,
165  memoryManager);
166 }
167 
169  armnn::IWorkloadFactory& workloadFactory,
171 {
172  return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
173  workloadFactory,
174  memoryManager,
176 }
177 
179  armnn::IWorkloadFactory& workloadFactory,
181 {
182  return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
183  workloadFactory,
184  memoryManager);
185 }
186 
188  armnn::IWorkloadFactory& workloadFactory,
190 {
191  return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
192  workloadFactory,
193  memoryManager,
195 }
196 
198  armnn::IWorkloadFactory& workloadFactory,
200 {
201  return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
202  workloadFactory,
203  memoryManager);
204 }
205 
207  armnn::IWorkloadFactory& workloadFactory,
209 {
210  return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
211  workloadFactory,
212  memoryManager,
214 }
215 
217  armnn::IWorkloadFactory& workloadFactory,
219 {
220  return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
221  workloadFactory,
222  memoryManager);
223 }
224 
226  armnn::IWorkloadFactory& workloadFactory,
228 {
229  return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
230  workloadFactory,
231  memoryManager,
233 }
234 
236  armnn::IWorkloadFactory& workloadFactory,
238 {
239  return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
240  workloadFactory,
241  memoryManager);
242 }
243 
245  armnn::IWorkloadFactory& workloadFactory,
247 {
248  return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
249  workloadFactory,
250  memoryManager,
252 }
DataLayout
Definition: Types.hpp:49
const TensorShape & GetShape() const
Definition: Tensor.hpp:187
LayerTestResult< float, 4 > SpaceToDepthNhwcFloat32Test2(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 4 > SpaceToDepthNhwcFloat32Test1(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
#define ARMNN_NO_DEPRECATE_WARN_BEGIN
Definition: Deprecated.hpp:33
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:131
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)
#define ARMNN_NO_DEPRECATE_WARN_END
Definition: Deprecated.hpp:34
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:465
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:481
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)