blob: 6d83b1ca9970230bc9023893b2a59082494e9082 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
telsoa014fcda012018-03-09 14:13:49 +00005
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01006#include "ActivationTestImpl.hpp"
7
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01008#include <QuantizeHelper.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01009#include <ResolveType.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010011#include <backendsCommon/test/ActivationFixture.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010012#include <backendsCommon/test/TensorCopyUtils.hpp>
13#include <backendsCommon/test/WorkloadTestUtils.hpp>
Keith Davis33a626f2020-08-27 15:38:12 +010014#include <reference/test/RefWorkloadFactoryHelper.hpp>
telsoa014fcda012018-03-09 14:13:49 +000015
Matthew Sloyan171214c2020-09-09 09:07:37 +010016#include <armnn/utility/NumericCast.hpp>
17
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000018#include <test/TensorHelpers.hpp>
telsoa014fcda012018-03-09 14:13:49 +000019
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010020#include <boost/multi_array.hpp>
21
telsoa014fcda012018-03-09 14:13:49 +000022#include <algorithm>
23
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000024template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000025LayerTestResult<T, 4> BoundedReLuTestCommon(
26 armnn::IWorkloadFactory& workloadFactory,
27 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +010028 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000029 float upperBound,
30 float lowerBound,
31 float inputScale,
32 int32_t inputOffset,
33 float outputScale,
34 int32_t outputOffset,
35 const std::vector<T>& inputData,
36 const std::vector<T>& outputExpectedData,
37 unsigned int inputWidth,
38 unsigned int inputHeight,
39 unsigned int inputChannels,
40 unsigned int inputBatchSize)
telsoa014fcda012018-03-09 14:13:49 +000041{
Jan Eilers8eb25602020-03-09 12:13:48 +000042 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +000043 unsigned int outputWidth = inputWidth;
44 unsigned int outputHeight = inputHeight;
45 unsigned int outputChannels = inputChannels;
46 unsigned int outputBatchSize = inputBatchSize;
47
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000048 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000049
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000050 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000051
52 if(armnn::IsQuantizedType<T>())
53 {
54 inputTensorInfo.SetQuantizationScale(inputScale);
55 inputTensorInfo.SetQuantizationOffset(inputOffset);
56
57 outputTensorInfo.SetQuantizationScale(outputScale);
58 outputTensorInfo.SetQuantizationOffset(outputOffset);
59 }
60
61 LayerTestResult<T, 4> result(inputTensorInfo);
62
63 auto input = MakeTensor<T, 4>(inputTensorInfo, inputData);
64
Keith Davis33a626f2020-08-27 15:38:12 +010065 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
66 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +000067
telsoa01c577f2c2018-08-31 09:22:23 +010068 // Setup bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +000069 armnn::ActivationQueueDescriptor descriptor;
70 armnn::WorkloadInfo workloadInfo;
71 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
72 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
73
74 descriptor.m_Parameters.m_Function = armnn::ActivationFunction::BoundedReLu;
75 descriptor.m_Parameters.m_A = upperBound;
76 descriptor.m_Parameters.m_B = lowerBound;
77
78 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
79
80 inputHandle->Allocate();
81 outputHandle->Allocate();
82
83 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
84
85 workload->Execute();
86
87 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
88
89 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputExpectedData);
90
91 return result;
92}
93
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000094LayerTestResult<float, 4> BoundedReLuUpperAndLowerBoundTest(
95 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +010096 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
97 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +000098{
99 unsigned int inputWidth = 4u;
100 unsigned int inputHeight = 5u;
101 unsigned int inputChannels = 1u;
102 unsigned int inputBatchSize = 1;
103
104 std::vector<float> input = std::vector<float>{
105 -2.0f, 0.1f, 0.5f, 1.25f,
106 0.786f, 0.9875f, -1.5f, 0.384f,
107 1.0001f, 3.5f, 7.5f, 0.896f,
108 2.126f, 2.0f, 0.3f, 0.15f,
109 0.999f, 1.2f, 0.89f, 6.1f,
110 };
111
telsoa01c577f2c2018-08-31 09:22:23 +0100112 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000113 std::vector<float> output = std::vector<float>{
114 -1.0f, 0.1f, 0.5f, 1.0f,
115 0.786f, 0.9875f, -1.0f, 0.384f,
116 1.0f, 1.0f, 1.0f, 0.896f,
117 1.0f, 1.0f, 0.3f, 0.15f,
118 0.999f, 1.0f, 0.89f, 1.0f,
119 };
120
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000121 return BoundedReLuTestCommon<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +0100122 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -1.0f, 1.0f, 0, 1.0f, 0, input, output,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000123 inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000124}
125
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000126LayerTestResult<float, 4> BoundedReLuUpperBoundOnlyTest(
127 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100128 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
129 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000130{
131 unsigned int inputWidth = 4u;
132 unsigned int inputHeight = 5u;
133 unsigned int inputChannels = 1u;
134 unsigned int inputBatchSize = 1;
135
136 std::vector<float> input = std::vector<float>{
137 -1.0f, 0.1f, 0.5f, 6.25f,
138 0.786f, 5.9875f, -0.5f, 0.384f,
139 6.0001f, 3.5f, 7.5f, 0.896f,
140 2.126f, 12.0f, 0.3f, 0.15f,
141 0.999f, 1.2f, 0.89f, 6.1f,
142 };
143
David Beckac42efd2018-09-26 17:41:13 +0100144 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000145 std::vector<float> output = std::vector<float>{
146 0.0f, 0.1f, 0.5f, 6.0f,
147 0.786f, 5.9875f, 0.0f, 0.384f,
148 6.0f, 3.5f, 6.0f, 0.896f,
149 2.126f, 6.0f, 0.3f, 0.15f,
150 0.999f, 1.2f, 0.89f, 6.0f,
151 };
152
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000153 return BoundedReLuTestCommon<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +0100154 workloadFactory, memoryManager, tensorHandleFactory, 6.0f, 0.0f, 1.0f, 0, 1.0f, 0, input, output,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000155 inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000156}
157
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000158LayerTestResult<uint8_t, 4> BoundedReLuUint8UpperBoundOnlyTest(
159 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100160 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
161 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000162{
163 unsigned int inputWidth = 3u;
164 unsigned int inputHeight = 2u;
165 unsigned int inputChannels = 1u;
166 unsigned int inputBatchSize = 1;
167
168 std::vector<uint8_t> input = std::vector<uint8_t>{
169 51, 124, 28,
170 251, 8, 92
171 };
172
David Beckac42efd2018-09-26 17:41:13 +0100173 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000174 std::vector<uint8_t> output = std::vector<uint8_t>{
175 0, 122, 0,
176 255, 0, 58
177 };
178
179 float inputScale = 12.0f / 255.0f;
180 int32_t inputOffset = 63;
181 float outputScale = 6.0f / 255.0f;
182 int32_t outputOffset = 0;
183
Derek Lambertif90c56d2020-01-10 17:14:08 +0000184 return BoundedReLuTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100185 workloadFactory, memoryManager, tensorHandleFactory, 6.0f, 0.0f,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000186 inputScale, inputOffset, outputScale, outputOffset,
187 input, output, inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000188}
189
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000190LayerTestResult<uint8_t, 4> BoundedReLuUint8UpperAndLowerBoundTest(
191 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100192 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
193 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000194{
195 unsigned int inputWidth = 3u;
196 unsigned int inputHeight = 2u;
197 unsigned int inputChannels = 1u;
198 unsigned int inputBatchSize = 1;
199
200 std::vector<uint8_t> input = std::vector<uint8_t>{
201 51, 230, 28,
202 251, 8, 92
203 };
204
telsoa01c577f2c2018-08-31 09:22:23 +0100205 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000206 std::vector<uint8_t> output = std::vector<uint8_t>{
207 51, 192, 32,
208 192, 32, 92
209 };
210
211 int32_t inputOffset = 112;
212 float inputScale = 0.0125f;
213
Derek Lambertif90c56d2020-01-10 17:14:08 +0000214 return BoundedReLuTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100215 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -1.0f,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000216 inputScale, inputOffset, inputScale, inputOffset, // Input/output scale & offset same.
217 input, output, inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000218}
219
220namespace
221{
222
223struct BoundedReLuRandomInputTestTraits
224{
225 constexpr static unsigned int inputHeight = 31u;
226 constexpr static unsigned int inputWidth = 19u;
227 constexpr static unsigned int inputChannels = 4u;
228 constexpr static unsigned int inputBatchSize = 2;
229
230 constexpr static unsigned int outputHeight = inputHeight;
231 constexpr static unsigned int outputWidth = inputWidth;
232 constexpr static unsigned int outputChannels = inputChannels;
233 constexpr static unsigned int outputBatchSize = inputBatchSize;
234
235 static armnn::TensorInfo GetInputTensorInfo()
236 {
237 return armnn::TensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
238 armnn::DataType::Float32);
239 }
240
241 static armnn::TensorInfo GetOutputTensorInfo()
242 {
243 return armnn::TensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
244 armnn::DataType::Float32);
245 }
246};
247
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000248boost::multi_array<float, 4> BoundedReLuRandomInputTest(
249 armnn::IWorkloadFactory& workloadFactory,
250 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100251 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000252 float lowerBound,
253 float upperBound,
254 const armnn::ActivationDescriptor& activationDescriptor)
telsoa014fcda012018-03-09 14:13:49 +0000255{
Jan Eilers8eb25602020-03-09 12:13:48 +0000256 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000257 const armnn::TensorInfo inputTensorInfo = BoundedReLuRandomInputTestTraits::GetInputTensorInfo();
258 const armnn::TensorInfo outputTensorInfo = BoundedReLuRandomInputTestTraits::GetOutputTensorInfo();
259
260 boost::multi_array<float, 4> output(GetTensorShapeAsArray<4>(outputTensorInfo));
261
telsoa01c577f2c2018-08-31 09:22:23 +0100262 // Min/max random values passed to MakeRandomTensor are purposely outside of the ReLu
263 // range [lowerBound, upperBound].
telsoa014fcda012018-03-09 14:13:49 +0000264 auto input = MakeRandomTensor<float, 4>(inputTensorInfo, 4605828, lowerBound - 5.0f, upperBound * 2.0f);
265
Keith Davis33a626f2020-08-27 15:38:12 +0100266 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
267 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000268
telsoa01c577f2c2018-08-31 09:22:23 +0100269 // Set up bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +0000270 armnn::ActivationQueueDescriptor descriptor;
271 armnn::WorkloadInfo workloadInfo;
272 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
273 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
274 descriptor.m_Parameters = activationDescriptor;
275
276 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
277
278 inputHandle->Allocate();
279 outputHandle->Allocate();
280
281 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
282
283 workload->Execute();
284
285 CopyDataFromITensorHandle(&output[0][0][0][0], outputHandle.get());
286
287 return output;
288}
289
290} // namespace
291
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000292LayerTestResult<float, 4> CompareBoundedReLuTest(
293 armnn::IWorkloadFactory& workloadFactory,
294 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
295 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100296 const armnn::ITensorHandleFactory& tensorHandleFactory,
297 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000298 float upperBound,
299 float lowerBound)
telsoa014fcda012018-03-09 14:13:49 +0000300{
301 LayerTestResult<float, 4> result(BoundedReLuRandomInputTestTraits::GetOutputTensorInfo());
302
303 armnn::ActivationDescriptor activationDescriptor;
304 activationDescriptor.m_Function = armnn::ActivationFunction::BoundedReLu;
305 activationDescriptor.m_A = upperBound;
306 activationDescriptor.m_B = lowerBound;
307
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000308 result.output = BoundedReLuRandomInputTest(
Keith Davis33a626f2020-08-27 15:38:12 +0100309 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, upperBound, activationDescriptor);
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000310 result.outputExpected = BoundedReLuRandomInputTest(
Keith Davis33a626f2020-08-27 15:38:12 +0100311 refWorkloadFactory, nullptr, refTensorHandleFactory, 0.0f, upperBound, activationDescriptor);
telsoa014fcda012018-03-09 14:13:49 +0000312
313 return result;
314}
315
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000316template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000317LayerTestResult<T,4> ConstantLinearActivationTestCommon(
318 armnn::IWorkloadFactory& workloadFactory,
319 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100320 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000321 float qScale = 0.0f,
322 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000323{
Jan Eilers8eb25602020-03-09 12:13:48 +0000324 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000325 unsigned int inputHeight = 20;
326 unsigned int inputWidth = 17;
327 unsigned int inputChannels = 3;
328 unsigned int batchSize = 5;
329
330 armnn::TensorInfo inputTensorInfo;
331 armnn::TensorInfo outputTensorInfo;
332
333 unsigned int shape[] = {batchSize, inputChannels, inputHeight, inputWidth};
334
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000335 inputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
336 outputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000337
338 // Set quantization parameters if the requested type is a quantized type.
339 if(armnn::IsQuantizedType<T>())
340 {
341 inputTensorInfo.SetQuantizationScale(qScale);
342 inputTensorInfo.SetQuantizationOffset(qOffset);
343 outputTensorInfo.SetQuantizationScale(qScale);
344 outputTensorInfo.SetQuantizationOffset(qOffset);
345 }
346
347 LayerTestResult<T, 4> ret(outputTensorInfo);
Keith Davis33a626f2020-08-27 15:38:12 +0100348 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
349 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000350
telsoa01c577f2c2018-08-31 09:22:23 +0100351 // Do linear activation that should leave the tensor unchanged.
telsoa014fcda012018-03-09 14:13:49 +0000352 armnn::ActivationQueueDescriptor data;
353 armnn::WorkloadInfo info;
354 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
355 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
356 data.m_Parameters.m_A = 1.0f;
357 data.m_Parameters.m_B = 0.0f;
358 data.m_Parameters.m_Function = armnn::ActivationFunction::Linear;
359
360 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(data, info);
361
362 inputHandle->Allocate();
363 outputHandle->Allocate();
364
365 boost::multi_array<T, 4> input = MakeRandomTensor<T, 4>(inputTensorInfo, 7123561);
366 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
367
368 workload->Execute();
369
370 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
371
telsoa01c577f2c2018-08-31 09:22:23 +0100372 // Ensure output equals input.
telsoa014fcda012018-03-09 14:13:49 +0000373 ret.outputExpected = input;
374
375 return ret;
376}
377
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000378LayerTestResult<float, 4> ConstantLinearActivationTest(
379 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100380 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
381 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000382{
Keith Davis33a626f2020-08-27 15:38:12 +0100383 return ConstantLinearActivationTestCommon<armnn::DataType::Float32>(workloadFactory,
384 memoryManager,
385 tensorHandleFactory);
telsoa014fcda012018-03-09 14:13:49 +0000386}
387
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000388LayerTestResult<uint8_t, 4> ConstantLinearActivationUint8Test(
389 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100390 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
391 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000392{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000393 return ConstantLinearActivationTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100394 workloadFactory, memoryManager, tensorHandleFactory, 4.0f, 3);
telsoa014fcda012018-03-09 14:13:49 +0000395}
396
Teresa Charlin18515e22019-04-24 10:17:46 +0100397LayerTestResult<int16_t, 4> ConstantLinearActivationInt16Test(
398 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100399 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
400 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100401{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000402 return ConstantLinearActivationTestCommon<armnn::DataType::QSymmS16>(
Keith Davis33a626f2020-08-27 15:38:12 +0100403 workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100404}
405
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000406template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000407LayerTestResult<T, 4> SimpleActivationTest(
408 armnn::IWorkloadFactory& workloadFactory,
409 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100410 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000411 armnn::ActivationFunction activationFunction,
412 float activationParameterA,
413 float activationParameterB,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100414 float scale,
415 int32_t offset,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000416 const std::vector<float>& inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100417 float outScale,
418 int32_t outOffset,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000419 const std::vector<float>& outputExpectedData)
telsoa014fcda012018-03-09 14:13:49 +0000420{
Jan Eilers8eb25602020-03-09 12:13:48 +0000421 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000422 constexpr static unsigned int inputWidth = 16u;
423 constexpr static unsigned int inputHeight = 1u;
424 constexpr static unsigned int inputChannels = 1u;
425 constexpr static unsigned int inputBatchSize = 1u;
426
427 constexpr static unsigned int outputWidth = inputWidth;
428 constexpr static unsigned int outputHeight = inputHeight;
429 constexpr static unsigned int outputChannels = inputChannels;
430 constexpr static unsigned int outputBatchSize = inputBatchSize;
431
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000432 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, ArmnnType);
433 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000434
435 // Set quantization parameters if the requested type is a quantized type.
436 if(armnn::IsQuantizedType<T>())
437 {
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100438 inputTensorInfo.SetQuantizationScale(scale);
439 inputTensorInfo.SetQuantizationOffset(offset);
440 outputTensorInfo.SetQuantizationScale(outScale);
441 outputTensorInfo.SetQuantizationOffset(outOffset);
telsoa014fcda012018-03-09 14:13:49 +0000442 }
443
444 LayerTestResult<T, 4> result(inputTensorInfo);
445
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100446 auto input = MakeTensor<T, 4>(inputTensorInfo, armnnUtils::QuantizedVector<T>(inputData, scale, offset));
telsoa014fcda012018-03-09 14:13:49 +0000447
Keith Davis33a626f2020-08-27 15:38:12 +0100448 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
449 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000450
telsoa01c577f2c2018-08-31 09:22:23 +0100451 // Setup bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +0000452 armnn::ActivationQueueDescriptor descriptor;
453 armnn::WorkloadInfo workloadInfo;
454 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
455 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
456
457 descriptor.m_Parameters.m_Function = activationFunction;
458 descriptor.m_Parameters.m_A = activationParameterA;
459 descriptor.m_Parameters.m_B = activationParameterB;
460
461 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
462
463 inputHandle->Allocate();
464 outputHandle->Allocate();
465
466 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
467
468 workload->Execute();
469
470 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
471
telsoa01c577f2c2018-08-31 09:22:23 +0100472 // Calculated manually.
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100473 result.outputExpected =
474 MakeTensor<T, 4>(outputTensorInfo, armnnUtils::QuantizedVector<T>(outputExpectedData, outScale, outOffset));
telsoa014fcda012018-03-09 14:13:49 +0000475
476 return result;
477}
478
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000479template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000480LayerTestResult<T, 4> SimpleSigmoidTestCommon(
481 armnn::IWorkloadFactory& workloadFactory,
482 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100483 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000484 float qScale,
485 int32_t qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000486{
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100487 std::vector<float> inputData =
488 {
telsoa014fcda012018-03-09 14:13:49 +0000489 -0.1f, -0.2f, -0.3f, -0.4f,
490 0.1f, 0.2f, 0.3f, 0.4f,
491 -1.0f, -2.0f, -3.0f, -4.0f,
492 1.0f, 2.0f, 3.0f, 4.0f
493 };
494
telsoa01c577f2c2018-08-31 09:22:23 +0100495 // Calculate output values for input.
telsoa014fcda012018-03-09 14:13:49 +0000496 auto f = [](float value)
497 {
498 return 1.0f / (1.0f + std::exp(-value));
499 };
500 std::vector<float> outputExpectedData(inputData.size());
501 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
502
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000503 return SimpleActivationTest<ArmnnType>(workloadFactory,
504 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100505 tensorHandleFactory,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000506 armnn::ActivationFunction::Sigmoid,
507 0.f,
508 0.f,
509 qScale,
510 qOffset,
511 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100512 1.f / 256.f,
513 0,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000514 outputExpectedData);
telsoa014fcda012018-03-09 14:13:49 +0000515}
516
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000517LayerTestResult<float, 4> SimpleSigmoidTest(
518 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100519 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
520 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000521{
Keith Davis33a626f2020-08-27 15:38:12 +0100522 return SimpleSigmoidTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager,
523 tensorHandleFactory, 0.0f, 0);
telsoa014fcda012018-03-09 14:13:49 +0000524}
525
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000526LayerTestResult<uint8_t, 4> SimpleSigmoidUint8Test(
527 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100528 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
529 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000530{
Keith Davis33a626f2020-08-27 15:38:12 +0100531 return SimpleSigmoidTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
532 tensorHandleFactory, 0.1f, 50);
telsoa014fcda012018-03-09 14:13:49 +0000533}
534
Teresa Charlin18515e22019-04-24 10:17:46 +0100535LayerTestResult<int16_t, 4> SimpleSigmoidInt16Test(
536 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100537 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
538 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100539{
Keith Davis33a626f2020-08-27 15:38:12 +0100540 return SimpleSigmoidTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager,
541 tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100542}
543
544template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
545LayerTestResult<T, 4> ReLuTestCommon(
546 armnn::IWorkloadFactory& workloadFactory,
547 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100548 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100549 float qScale,
550 int32_t qOffset)
551{
552 std::vector<float> inputData = {
553 -0.1f, -0.2f, -0.3f, -0.4f,
554 0.1f, 0.2f, 0.3f, 0.4f,
555 -1.0f, -2.0f, -3.0f, -4.0f,
556 1.0f, 2.0f, 3.0f, 4.0f
557 };
558
559 // Calculate output values for input.
560 auto f = [](float value)
561 {
562 return std::fmax(0.0f, value);
563 };
564 std::vector<float> outputExpectedData(inputData.size());
565 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
566
567 return SimpleActivationTest<ArmnnType>(workloadFactory,
568 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100569 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100570 armnn::ActivationFunction::ReLu,
571 0.f,
572 0.f,
573 qScale,
574 qOffset,
575 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100576 qScale,
577 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100578 outputExpectedData);
579}
580
581LayerTestResult<int16_t, 4> ReLuInt16Test(
582 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100583 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
584 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100585{
Keith Davis33a626f2020-08-27 15:38:12 +0100586 return ReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100587}
588
589
konsof017f6db402019-06-07 15:15:58 +0100590LayerTestResult<uint8_t, 4> ReLuUint8Test(
591 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100592 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
593 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100594{
Keith Davis33a626f2020-08-27 15:38:12 +0100595 return ReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100596}
597
598LayerTestResult<float, 4> ReLuTest(
599 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100600 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
601 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100602{
Keith Davis33a626f2020-08-27 15:38:12 +0100603 return ReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100604}
605
606
Teresa Charlin18515e22019-04-24 10:17:46 +0100607template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
608LayerTestResult<T, 4> BoundedReLuTestCommon(
609 armnn::IWorkloadFactory& workloadFactory,
610 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100611 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100612 float qScale,
613 int32_t qOffset)
614{
615 std::vector<float> inputData = {
616 -0.1f, -0.2f, -0.3f, -0.4f,
617 0.1f, 0.2f, 0.3f, 0.4f,
618 -1.0f, -2.0f, -3.0f, -4.0f,
619 1.0f, 2.0f, 3.0f, 4.0f
620 };
621 const float a = 1.0f;
622 const float b = -1.0f;
623 // Calculate output values for input.
624 auto f = [a, b](float value)
625 {
626 return std::min(a, std::max(b, value));
627 };
628 std::vector<float> outputExpectedData(inputData.size());
629 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
630
631 return SimpleActivationTest<ArmnnType>(workloadFactory,
632 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100633 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100634 armnn::ActivationFunction::BoundedReLu,
635 a,
636 b,
637 qScale,
638 qOffset,
639 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100640 qScale,
641 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100642 outputExpectedData);
643}
644
645LayerTestResult<int16_t, 4> BoundedReLuInt16Test(
646 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100647 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
648 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100649{
Keith Davis33a626f2020-08-27 15:38:12 +0100650 return ReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100651}
652
653
654
655template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
656LayerTestResult<T, 4> SoftReLuTestCommon(
657 armnn::IWorkloadFactory& workloadFactory,
658 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100659 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100660 float qScale,
661 int32_t qOffset)
662{
663 std::vector<float> inputData = {
664 -0.1f, -0.2f, -0.3f, -0.4f,
665 0.1f, 0.2f, 0.3f, 0.4f,
666 -1.0f, -2.0f, -3.0f, -4.0f,
667 1.0f, 2.0f, 3.0f, 4.0f
668 };
669
670 // Calculate output values for input.
671 auto f = [](float value)
672 {
673 return std::log(1.0f + std::exp(value));
674 };
675 std::vector<float> outputExpectedData(inputData.size());
676 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
677
678 return SimpleActivationTest<ArmnnType>(workloadFactory,
679 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100680 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100681 armnn::ActivationFunction::SoftReLu,
682 0.f,
683 0.f,
684 qScale,
685 qOffset,
686 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100687 qScale,
688 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100689 outputExpectedData);
690}
691
konsof017f6db402019-06-07 15:15:58 +0100692LayerTestResult<float, 4> SoftReLuTest(
693 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100694 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
695 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100696{
Keith Davis33a626f2020-08-27 15:38:12 +0100697 return SoftReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100698}
699
700LayerTestResult<uint8_t, 4> SoftReLuUint8Test(
701 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100702 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
703 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100704{
Keith Davis33a626f2020-08-27 15:38:12 +0100705 return SoftReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
706 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100707}
708
Teresa Charlin18515e22019-04-24 10:17:46 +0100709LayerTestResult<int16_t, 4> SoftReLuInt16Test(
710 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100711 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
712 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100713{
Keith Davis33a626f2020-08-27 15:38:12 +0100714 return SoftReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100715}
716
717template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
718LayerTestResult<T, 4> LeakyReLuTestCommon(
719 armnn::IWorkloadFactory& workloadFactory,
720 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100721 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100722 float qScale,
723 int32_t qOffset)
724{
725 std::vector<float> inputData = {
726 -0.1f, -0.2f, -0.3f, -0.4f,
727 0.1f, 0.2f, 0.3f, 0.4f,
728 -1.0f, -2.0f, -3.0f, -4.0f,
729 1.0f, 2.0f, 3.0f, 4.0f
730 };
731
732 const float a = 0.01f;
733 // Calculate output values for input.
734 auto f = [a](float value)
735 {
736 return value > 0.0f ? value : (value * a);
737 };
738 std::vector<float> outputExpectedData(inputData.size());
739 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
740
741 return SimpleActivationTest<ArmnnType>(workloadFactory,
742 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100743 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100744 armnn::ActivationFunction::LeakyReLu,
745 a,
746 0.f,
747 qScale,
748 qOffset,
749 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100750 qScale,
751 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100752 outputExpectedData);
753}
754
konsof017f6db402019-06-07 15:15:58 +0100755LayerTestResult<float, 4> LeakyReLuTest(
756 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100757 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
758 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100759{
Keith Davis33a626f2020-08-27 15:38:12 +0100760 return LeakyReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100761}
762
763LayerTestResult<uint8_t, 4> LeakyReLuUint8Test(
764 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100765 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
766 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100767{
Keith Davis33a626f2020-08-27 15:38:12 +0100768 return LeakyReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
769 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100770}
771
Teresa Charlin18515e22019-04-24 10:17:46 +0100772LayerTestResult<int16_t, 4> LeakyReLuInt16Test(
773 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100774 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
775 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100776{
Keith Davis33a626f2020-08-27 15:38:12 +0100777 return LeakyReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100778}
779
780template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
781LayerTestResult<T, 4> AbsTestCommon(
782 armnn::IWorkloadFactory& workloadFactory,
783 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100784 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100785 float qScale,
786 int32_t qOffset)
787{
788 std::vector<float> inputData = {
789 -0.1f, -0.2f, -0.3f, -0.4f,
790 0.1f, 0.2f, 0.3f, 0.4f,
791 -1.0f, -2.0f, -3.0f, -4.0f,
792 1.0f, 2.0f, 3.0f, 4.0f
793 };
794
795 // Calculate output values for input.
796 auto f = [](float value)
797 {
798 return std::abs(value);
799 };
800 std::vector<float> outputExpectedData(inputData.size());
801 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
802
803 return SimpleActivationTest<ArmnnType>(workloadFactory,
804 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100805 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100806 armnn::ActivationFunction::Abs,
807 0.f,
808 0.f,
809 qScale,
810 qOffset,
811 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100812 qScale,
813 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100814 outputExpectedData);
815}
816
konsof017f6db402019-06-07 15:15:58 +0100817LayerTestResult<float, 4> AbsTest(
818 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100819 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
820 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100821{
Keith Davis33a626f2020-08-27 15:38:12 +0100822 return AbsTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100823}
824
825LayerTestResult<uint8_t, 4> AbsUint8Test(
826 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100827 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
828 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100829{
Keith Davis33a626f2020-08-27 15:38:12 +0100830 return AbsTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100831}
832
Teresa Charlin18515e22019-04-24 10:17:46 +0100833LayerTestResult<int16_t, 4> AbsInt16Test(
834 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100835 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
836 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100837{
Keith Davis33a626f2020-08-27 15:38:12 +0100838 return AbsTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100839}
840
Sadik Armagan6095ba52019-09-13 17:07:19 +0100841LayerTestResult<float, 5> SqrtNNTest(
842 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100843 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
844 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan6095ba52019-09-13 17:07:19 +0100845{
Jan Eilers8eb25602020-03-09 12:13:48 +0000846 IgnoreUnused(memoryManager);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100847 const int inputDataSize = 120;
848 std::vector<float> inputData(inputDataSize);
849
850 for (unsigned int i = 0u; i < inputDataSize; ++i)
851 {
852 inputData[i] = static_cast<float>(i) / 10;
853 }
854
855 auto f = [](float value)
856 {
857 return std::sqrt(value);
858 };
859 std::vector<float> outputExpectedData(inputDataSize);
860 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
861
862 armnn::TensorInfo inputTensorInfo(
863 { 1u, 2u, 3u, 4u, 5u }, armnn::DataType::Float32);
864 armnn::TensorInfo outputTensorInfo(
865 { 1u, 2u, 3u, 4u, 5u }, armnn::DataType::Float32);
866
867 LayerTestResult<float, 5> result(inputTensorInfo);
868
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100869 auto input = MakeTensor<float, 5>(inputTensorInfo, inputData);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100870
Keith Davis33a626f2020-08-27 15:38:12 +0100871 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
872 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100873
874 armnn::ActivationQueueDescriptor descriptor;
875 armnn::WorkloadInfo workloadInfo;
876 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
877 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
878
879 descriptor.m_Parameters.m_Function = armnn::ActivationFunction::Sqrt;
880
881 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
882
883 inputHandle->Allocate();
884 outputHandle->Allocate();
885
886 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0][0]);
887
888 workload->Execute();
889
890 CopyDataFromITensorHandle(&result.output[0][0][0][0][0], outputHandle.get());
891
892 // Calculated manually.
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100893 result.outputExpected = MakeTensor<float, 5>(outputTensorInfo, outputExpectedData);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100894
895 return result;
896};
897
Teresa Charlin18515e22019-04-24 10:17:46 +0100898template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
899LayerTestResult<T, 4> SqrtTestCommon(
900 armnn::IWorkloadFactory& workloadFactory,
901 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100902 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100903 float qScale,
904 int32_t qOffset)
905{
906 std::vector<float> inputData = {
907 0.1f, 0.2f, 0.3f, 0.4f,
908 0.1f, 0.2f, 0.3f, 0.4f,
909 1.0f, 2.0f, 3.0f, 4.0f,
910 1.0f, 2.0f, 3.0f, 4.0f
911 };
912
913 // Calculate output values for input.
914 auto f = [](float value)
915 {
916 return std::sqrt(value);
917 };
918 std::vector<float> outputExpectedData(inputData.size());
919 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
920
921 return SimpleActivationTest<ArmnnType>(workloadFactory,
922 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100923 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100924 armnn::ActivationFunction::Sqrt,
925 0.f,
926 0.f,
927 qScale,
928 qOffset,
929 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100930 qScale,
931 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100932 outputExpectedData);
933}
934
konsof017f6db402019-06-07 15:15:58 +0100935LayerTestResult<float, 4> SqrtTest(
936 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100937 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
938 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100939{
Keith Davis33a626f2020-08-27 15:38:12 +0100940 return SqrtTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100941}
942
943LayerTestResult<uint8_t, 4> SqrtUint8Test(
944 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100945 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
946 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100947{
Keith Davis33a626f2020-08-27 15:38:12 +0100948 return SqrtTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100949}
950
Teresa Charlin18515e22019-04-24 10:17:46 +0100951LayerTestResult<int16_t, 4> SqrtInt16Test(
952 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100953 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
954 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100955{
Keith Davis33a626f2020-08-27 15:38:12 +0100956 return SqrtTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100957}
958
959template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
960LayerTestResult<T, 4> SquareTestCommon(
961 armnn::IWorkloadFactory& workloadFactory,
962 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100963 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100964 float qScale,
965 int32_t qOffset)
966{
967 std::vector<float> inputData = {
968 -0.1f, -0.2f, -0.3f, -0.4f,
969 0.1f, 0.2f, 0.3f, 0.4f,
970 -1.0f, -2.0f, -3.0f, -4.0f,
971 1.0f, 2.0f, 3.0f, 4.0f
972 };
973
974 // Calculate output values for input.
975 auto f = [](float value)
976 {
977 return std::pow(value,2);
978 };
979 std::vector<float> outputExpectedData(inputData.size());
980 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
981
982 return SimpleActivationTest<ArmnnType>(workloadFactory,
983 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100984 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100985 armnn::ActivationFunction::Square,
986 0.f,
987 0.f,
988 qScale,
989 qOffset,
990 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100991 qScale,
992 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100993 outputExpectedData);
994}
995
konsof017f6db402019-06-07 15:15:58 +0100996LayerTestResult<float, 4> SquareTest(
997 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100998 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
999 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001000{
Keith Davis33a626f2020-08-27 15:38:12 +01001001 return SquareTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +01001002}
1003
1004LayerTestResult<uint8_t, 4> SquareUint8Test(
1005 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001006 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1007 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001008{
Keith Davis33a626f2020-08-27 15:38:12 +01001009 return SquareTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
1010 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +01001011}
1012
Teresa Charlin18515e22019-04-24 10:17:46 +01001013LayerTestResult<int16_t, 4> SquareInt16Test(
1014 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001015 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1016 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +01001017{
Keith Davis33a626f2020-08-27 15:38:12 +01001018 return SquareTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001019}
1020
1021template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1022LayerTestResult<T, 4> TanhTestCommon(
1023 armnn::IWorkloadFactory& workloadFactory,
1024 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001025 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001026 float qScale,
1027 int32_t qOffset)
1028{
1029 std::vector<float> inputData = {
1030 -0.1f, -0.2f, -0.3f, -0.4f,
1031 0.1f, 0.2f, 0.3f, 0.4f,
1032 -1.0f, -2.0f, -3.0f, -4.0f,
1033 1.0f, 2.0f, 3.0f, 4.0f
1034 };
1035
1036 const float a = 2.0f;
1037 const float b = 3.0f;
1038 // Calculate output values for input.
1039 auto f = [a, b](float value)
1040 {
1041 return a * tanhf(b * value);
1042 };
1043 std::vector<float> outputExpectedData(inputData.size());
1044 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
1045
1046 return SimpleActivationTest<ArmnnType>(workloadFactory,
1047 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001048 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001049 armnn::ActivationFunction::TanH,
1050 a,
1051 b,
1052 qScale,
1053 qOffset,
1054 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +01001055 qScale,
1056 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +01001057 outputExpectedData);
1058}
1059
konsof017f6db402019-06-07 15:15:58 +01001060LayerTestResult<float, 4> TanhTest(
1061 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001062 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1063 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001064{
Keith Davis33a626f2020-08-27 15:38:12 +01001065 return TanhTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +01001066}
1067
1068LayerTestResult<uint8_t, 4> TanhUint8Test(
1069 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001070 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1071 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001072{
Keith Davis33a626f2020-08-27 15:38:12 +01001073 return TanhTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 64);
konsof017f6db402019-06-07 15:15:58 +01001074}
1075
Teresa Charlin18515e22019-04-24 10:17:46 +01001076LayerTestResult<int16_t, 4> TanhInt16Test(
1077 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001078 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1079 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +01001080{
Keith Davis33a626f2020-08-27 15:38:12 +01001081 return TanhTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001082}
1083
1084
David Monahan3b3c3812020-02-25 09:03:29 +00001085template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1086LayerTestResult<T, 4> EluTestCommon(
1087 armnn::IWorkloadFactory& workloadFactory,
1088 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001089 const armnn::ITensorHandleFactory& tensorHandleFactory,
David Monahan3b3c3812020-02-25 09:03:29 +00001090 float qScale,
1091 int32_t qOffset)
1092{
1093 std::vector<float> inputData = {
1094 -0.1f, -0.2f, -0.3f, -0.4f,
1095 0.1f, 0.2f, 0.3f, 0.4f,
1096 -1.0f, -2.0f, -3.0f, -4.0f,
1097 1.0f, 2.0f, 3.0f, 4.0f
1098 };
1099
1100
1101 const float a = 0.01f;
1102 // Calculate output values for input.
1103 auto f = [a](float value)
1104 {
1105 return (value >= 0) ? value : a * (expf(value) - 1);
1106 };
1107 std::vector<float> outputExpectedData(inputData.size());
1108 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
1109
1110 return SimpleActivationTest<ArmnnType>(workloadFactory,
1111 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001112 tensorHandleFactory,
David Monahan3b3c3812020-02-25 09:03:29 +00001113 armnn::ActivationFunction::Elu,
1114 a,
1115 0.0f,
1116 qScale,
1117 qOffset,
1118 inputData,
1119 qScale,
1120 qOffset,
1121 outputExpectedData);
1122}
1123
1124LayerTestResult<float, 4> EluTest(
1125 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001126 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1127 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001128{
Keith Davis33a626f2020-08-27 15:38:12 +01001129 return EluTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
David Monahan3b3c3812020-02-25 09:03:29 +00001130}
1131
1132LayerTestResult<uint8_t, 4> EluUint8Test(
1133 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001134 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1135 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001136{
Keith Davis33a626f2020-08-27 15:38:12 +01001137 return EluTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 64);
David Monahan3b3c3812020-02-25 09:03:29 +00001138}
1139
1140LayerTestResult<int16_t, 4> EluInt16Test(
1141 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001142 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1143 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001144{
Keith Davis33a626f2020-08-27 15:38:12 +01001145 return EluTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
David Monahan3b3c3812020-02-25 09:03:29 +00001146}
1147
Teresa Charlin18515e22019-04-24 10:17:46 +01001148
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001149template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001150LayerTestResult<T, 4> HardSwishTestCommon(
1151 armnn::IWorkloadFactory& workloadFactory,
1152 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001153 const armnn::ITensorHandleFactory& tensorHandleFactory,
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001154 float qScale,
1155 int32_t qOffset)
1156{
1157 std::vector<float> inputData = {
1158 -0.1f, -0.2f, -0.3f, -0.4f,
1159 0.1f, 0.2f, 0.3f, 0.4f,
1160 -1.0f, -2.0f, -3.0f, -4.0f,
1161 1.0f, 2.0f, 3.0f, 4.0f
1162 };
1163 // Calculate output values for input.
1164 auto f = [](float x)
1165 {
1166 // Break down the calculation to help with verification.
1167 // hard_swish(x) = x * relu6(x+3) / 6
1168 // relu6(x) = min(max(x,0),6)
1169 float reLu6_step1 = std::max((x + 3),0.0f);
1170 float reLu6Complete = std::min(reLu6_step1, 6.0f);
1171 float hardSwish_step1 = x * reLu6Complete;
1172 float result = hardSwish_step1 / 6;
1173 return result;
1174 };
1175 std::vector<float> outputExpectedData(inputData.size());
1176 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
1177
1178 return SimpleActivationTest<ArmnnType>(workloadFactory,
1179 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001180 tensorHandleFactory,
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001181 armnn::ActivationFunction::HardSwish,
1182 0.f,
1183 0.f,
1184 qScale,
1185 qOffset,
1186 inputData,
1187 qScale,
1188 qOffset,
1189 outputExpectedData);
1190}
1191
1192LayerTestResult<float, 4> HardSwishTest(
1193 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001194 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1195 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001196{
Keith Davis33a626f2020-08-27 15:38:12 +01001197 return HardSwishTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001198}
1199
1200LayerTestResult<uint8_t, 4> HardSwishUint8Test(
1201 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001202 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1203 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001204{
Keith Davis33a626f2020-08-27 15:38:12 +01001205 return HardSwishTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
1206 tensorHandleFactory, 0.1f, 64);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001207}
1208
1209LayerTestResult<int16_t, 4> HardSwishInt16Test(
1210 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001211 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1212 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001213{
Keith Davis33a626f2020-08-27 15:38:12 +01001214 return HardSwishTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001215}
1216
1217
1218template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001219LayerTestResult<T,4> CompareActivationTestImpl(
1220 armnn::IWorkloadFactory& workloadFactory,
1221 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1222 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001223 const armnn::ITensorHandleFactory& tensorHandleFactory,
1224 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001225 armnn::ActivationFunction f,
1226 unsigned int batchSize = 5,
1227 float qScale = 0.0f,
1228 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001229{
Jan Eilers8eb25602020-03-09 12:13:48 +00001230 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +00001231 unsigned int width = 17;
1232 unsigned int height = 29;
1233 unsigned int channels = 2;
1234
1235 float a = 0.234f;
1236 float b = -12.345f;
1237
1238 armnn::TensorInfo inputTensorInfo;
1239 armnn::TensorInfo outputTensorInfo;
1240
1241 unsigned int shape[] = {batchSize, channels, height, width};
1242
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001243 inputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
1244 outputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001245
1246 // Set quantization parameters if the requested type is a quantized type.
1247 if(armnn::IsQuantizedType<T>())
1248 {
1249 inputTensorInfo.SetQuantizationScale(qScale);
1250 inputTensorInfo.SetQuantizationOffset(qOffset);
1251 outputTensorInfo.SetQuantizationScale(qScale);
1252 outputTensorInfo.SetQuantizationOffset(qOffset);
1253 }
1254
1255 float minVal = -10.f;
1256 if (f == armnn::ActivationFunction::Sqrt)
1257 {
1258 minVal = 0.f;
1259 }
1260
1261 boost::multi_array<T, 4> input = MakeRandomTensor<T, 4>(inputTensorInfo, 21453, minVal, 10.f);
1262
1263
1264 LayerTestResult<T,4> ret(outputTensorInfo);
1265 auto boostArrayExtents = boost::extents
Matthew Sloyan171214c2020-09-09 09:07:37 +01001266 [armnn::numeric_cast<boost::multi_array_types::extent_gen::index>(batchSize)]
1267 [armnn::numeric_cast<boost::multi_array_types::extent_gen::index>(channels)]
1268 [armnn::numeric_cast<boost::multi_array_types::extent_gen::index>(height)]
1269 [armnn::numeric_cast<boost::multi_array_types::extent_gen::index>(width)];
telsoa014fcda012018-03-09 14:13:49 +00001270 ret.output.resize(boostArrayExtents);
1271 ret.outputExpected.resize(boostArrayExtents);
1272
Keith Davis33a626f2020-08-27 15:38:12 +01001273 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
1274 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +00001275
Keith Davis33a626f2020-08-27 15:38:12 +01001276 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refTensorHandleFactory.CreateTensorHandle(inputTensorInfo);
1277 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refTensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +00001278
1279 armnn::ActivationQueueDescriptor data;
1280 armnn::WorkloadInfo info;
1281 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
1282 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1283 data.m_Parameters.m_A = a;
1284 data.m_Parameters.m_B = b;
1285 data.m_Parameters.m_Function = f;
1286
1287 armnn::ActivationQueueDescriptor refData = data;
1288 armnn::WorkloadInfo refInfo = info;
1289 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
1290 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
1291
1292 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(data, info);
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001293 ARMNN_ASSERT(workload != nullptr);
telsoa014fcda012018-03-09 14:13:49 +00001294 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateActivation(refData, refInfo);
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001295 ARMNN_ASSERT(workloadRef != nullptr);
telsoa014fcda012018-03-09 14:13:49 +00001296
1297 inputHandle->Allocate();
1298 outputHandle->Allocate();
1299 inputHandleRef->Allocate();
1300 outputHandleRef->Allocate();
1301
1302 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
1303 CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
1304
1305 workload->Execute();
1306 workloadRef->Execute();
1307
1308 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
1309 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
1310
1311 return ret;
1312}
1313
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001314LayerTestResult<float,4> CompareActivationTest(
1315 armnn::IWorkloadFactory& workloadFactory,
1316 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1317 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001318 const armnn::ITensorHandleFactory& tensorHandleFactory,
1319 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001320 armnn::ActivationFunction f,
1321 unsigned int batchSize)
telsoa014fcda012018-03-09 14:13:49 +00001322{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001323 return CompareActivationTestImpl<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +01001324 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory,
1325 refTensorHandleFactory, f, batchSize);
telsoa014fcda012018-03-09 14:13:49 +00001326}
1327
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001328LayerTestResult<uint8_t,4> CompareActivationUint8Test(
1329 armnn::IWorkloadFactory& workloadFactory,
1330 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1331 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001332 const armnn::ITensorHandleFactory& tensorHandleFactory,
1333 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001334 armnn::ActivationFunction f)
telsoa014fcda012018-03-09 14:13:49 +00001335{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001336 return CompareActivationTestImpl<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +01001337 workloadFactory, memoryManager, refWorkloadFactory,
1338 tensorHandleFactory, refTensorHandleFactory, f, 5, 0.1f, 50);
telsoa014fcda012018-03-09 14:13:49 +00001339}
Teresa Charlin18515e22019-04-24 10:17:46 +01001340
1341LayerTestResult<int16_t,4> CompareActivationInt16Test(
1342 armnn::IWorkloadFactory& workloadFactory,
1343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1344 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001345 const armnn::ITensorHandleFactory& tensorHandleFactory,
1346 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001347 armnn::ActivationFunction f)
1348{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001349 return CompareActivationTestImpl<armnn::DataType::QSymmS16>(
Keith Davis33a626f2020-08-27 15:38:12 +01001350 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory,
1351 refTensorHandleFactory, f, 5, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001352}