blob: 543ea7716a13cc8796b1df644c8d395779daebce [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
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000016#include <test/TensorHelpers.hpp>
telsoa014fcda012018-03-09 14:13:49 +000017
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010018#include <boost/multi_array.hpp>
19
telsoa014fcda012018-03-09 14:13:49 +000020#include <algorithm>
21
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000022template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000023LayerTestResult<T, 4> BoundedReLuTestCommon(
24 armnn::IWorkloadFactory& workloadFactory,
25 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +010026 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000027 float upperBound,
28 float lowerBound,
29 float inputScale,
30 int32_t inputOffset,
31 float outputScale,
32 int32_t outputOffset,
33 const std::vector<T>& inputData,
34 const std::vector<T>& outputExpectedData,
35 unsigned int inputWidth,
36 unsigned int inputHeight,
37 unsigned int inputChannels,
38 unsigned int inputBatchSize)
telsoa014fcda012018-03-09 14:13:49 +000039{
Jan Eilers8eb25602020-03-09 12:13:48 +000040 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +000041 unsigned int outputWidth = inputWidth;
42 unsigned int outputHeight = inputHeight;
43 unsigned int outputChannels = inputChannels;
44 unsigned int outputBatchSize = inputBatchSize;
45
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000046 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000047
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000048 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000049
50 if(armnn::IsQuantizedType<T>())
51 {
52 inputTensorInfo.SetQuantizationScale(inputScale);
53 inputTensorInfo.SetQuantizationOffset(inputOffset);
54
55 outputTensorInfo.SetQuantizationScale(outputScale);
56 outputTensorInfo.SetQuantizationOffset(outputOffset);
57 }
58
59 LayerTestResult<T, 4> result(inputTensorInfo);
60
61 auto input = MakeTensor<T, 4>(inputTensorInfo, inputData);
62
Keith Davis33a626f2020-08-27 15:38:12 +010063 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
64 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +000065
telsoa01c577f2c2018-08-31 09:22:23 +010066 // Setup bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +000067 armnn::ActivationQueueDescriptor descriptor;
68 armnn::WorkloadInfo workloadInfo;
69 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
70 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
71
72 descriptor.m_Parameters.m_Function = armnn::ActivationFunction::BoundedReLu;
73 descriptor.m_Parameters.m_A = upperBound;
74 descriptor.m_Parameters.m_B = lowerBound;
75
76 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
77
78 inputHandle->Allocate();
79 outputHandle->Allocate();
80
81 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
82
83 workload->Execute();
84
85 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
86
87 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputExpectedData);
88
89 return result;
90}
91
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000092LayerTestResult<float, 4> BoundedReLuUpperAndLowerBoundTest(
93 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +010094 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
95 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +000096{
97 unsigned int inputWidth = 4u;
98 unsigned int inputHeight = 5u;
99 unsigned int inputChannels = 1u;
100 unsigned int inputBatchSize = 1;
101
102 std::vector<float> input = std::vector<float>{
103 -2.0f, 0.1f, 0.5f, 1.25f,
104 0.786f, 0.9875f, -1.5f, 0.384f,
105 1.0001f, 3.5f, 7.5f, 0.896f,
106 2.126f, 2.0f, 0.3f, 0.15f,
107 0.999f, 1.2f, 0.89f, 6.1f,
108 };
109
telsoa01c577f2c2018-08-31 09:22:23 +0100110 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000111 std::vector<float> output = std::vector<float>{
112 -1.0f, 0.1f, 0.5f, 1.0f,
113 0.786f, 0.9875f, -1.0f, 0.384f,
114 1.0f, 1.0f, 1.0f, 0.896f,
115 1.0f, 1.0f, 0.3f, 0.15f,
116 0.999f, 1.0f, 0.89f, 1.0f,
117 };
118
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000119 return BoundedReLuTestCommon<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +0100120 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -1.0f, 1.0f, 0, 1.0f, 0, input, output,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000121 inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000122}
123
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000124LayerTestResult<float, 4> BoundedReLuUpperBoundOnlyTest(
125 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100126 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
127 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000128{
129 unsigned int inputWidth = 4u;
130 unsigned int inputHeight = 5u;
131 unsigned int inputChannels = 1u;
132 unsigned int inputBatchSize = 1;
133
134 std::vector<float> input = std::vector<float>{
135 -1.0f, 0.1f, 0.5f, 6.25f,
136 0.786f, 5.9875f, -0.5f, 0.384f,
137 6.0001f, 3.5f, 7.5f, 0.896f,
138 2.126f, 12.0f, 0.3f, 0.15f,
139 0.999f, 1.2f, 0.89f, 6.1f,
140 };
141
David Beckac42efd2018-09-26 17:41:13 +0100142 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000143 std::vector<float> output = std::vector<float>{
144 0.0f, 0.1f, 0.5f, 6.0f,
145 0.786f, 5.9875f, 0.0f, 0.384f,
146 6.0f, 3.5f, 6.0f, 0.896f,
147 2.126f, 6.0f, 0.3f, 0.15f,
148 0.999f, 1.2f, 0.89f, 6.0f,
149 };
150
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000151 return BoundedReLuTestCommon<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +0100152 workloadFactory, memoryManager, tensorHandleFactory, 6.0f, 0.0f, 1.0f, 0, 1.0f, 0, input, output,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000153 inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000154}
155
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000156LayerTestResult<uint8_t, 4> BoundedReLuUint8UpperBoundOnlyTest(
157 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100158 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
159 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000160{
161 unsigned int inputWidth = 3u;
162 unsigned int inputHeight = 2u;
163 unsigned int inputChannels = 1u;
164 unsigned int inputBatchSize = 1;
165
166 std::vector<uint8_t> input = std::vector<uint8_t>{
167 51, 124, 28,
168 251, 8, 92
169 };
170
David Beckac42efd2018-09-26 17:41:13 +0100171 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000172 std::vector<uint8_t> output = std::vector<uint8_t>{
173 0, 122, 0,
174 255, 0, 58
175 };
176
177 float inputScale = 12.0f / 255.0f;
178 int32_t inputOffset = 63;
179 float outputScale = 6.0f / 255.0f;
180 int32_t outputOffset = 0;
181
Derek Lambertif90c56d2020-01-10 17:14:08 +0000182 return BoundedReLuTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100183 workloadFactory, memoryManager, tensorHandleFactory, 6.0f, 0.0f,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000184 inputScale, inputOffset, outputScale, outputOffset,
185 input, output, inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000186}
187
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000188LayerTestResult<uint8_t, 4> BoundedReLuUint8UpperAndLowerBoundTest(
189 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100190 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
191 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000192{
193 unsigned int inputWidth = 3u;
194 unsigned int inputHeight = 2u;
195 unsigned int inputChannels = 1u;
196 unsigned int inputBatchSize = 1;
197
198 std::vector<uint8_t> input = std::vector<uint8_t>{
199 51, 230, 28,
200 251, 8, 92
201 };
202
telsoa01c577f2c2018-08-31 09:22:23 +0100203 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000204 std::vector<uint8_t> output = std::vector<uint8_t>{
205 51, 192, 32,
206 192, 32, 92
207 };
208
209 int32_t inputOffset = 112;
210 float inputScale = 0.0125f;
211
Derek Lambertif90c56d2020-01-10 17:14:08 +0000212 return BoundedReLuTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100213 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -1.0f,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000214 inputScale, inputOffset, inputScale, inputOffset, // Input/output scale & offset same.
215 input, output, inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000216}
217
218namespace
219{
220
221struct BoundedReLuRandomInputTestTraits
222{
223 constexpr static unsigned int inputHeight = 31u;
224 constexpr static unsigned int inputWidth = 19u;
225 constexpr static unsigned int inputChannels = 4u;
226 constexpr static unsigned int inputBatchSize = 2;
227
228 constexpr static unsigned int outputHeight = inputHeight;
229 constexpr static unsigned int outputWidth = inputWidth;
230 constexpr static unsigned int outputChannels = inputChannels;
231 constexpr static unsigned int outputBatchSize = inputBatchSize;
232
233 static armnn::TensorInfo GetInputTensorInfo()
234 {
235 return armnn::TensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
236 armnn::DataType::Float32);
237 }
238
239 static armnn::TensorInfo GetOutputTensorInfo()
240 {
241 return armnn::TensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
242 armnn::DataType::Float32);
243 }
244};
245
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000246boost::multi_array<float, 4> BoundedReLuRandomInputTest(
247 armnn::IWorkloadFactory& workloadFactory,
248 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100249 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000250 float lowerBound,
251 float upperBound,
252 const armnn::ActivationDescriptor& activationDescriptor)
telsoa014fcda012018-03-09 14:13:49 +0000253{
Jan Eilers8eb25602020-03-09 12:13:48 +0000254 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000255 const armnn::TensorInfo inputTensorInfo = BoundedReLuRandomInputTestTraits::GetInputTensorInfo();
256 const armnn::TensorInfo outputTensorInfo = BoundedReLuRandomInputTestTraits::GetOutputTensorInfo();
257
258 boost::multi_array<float, 4> output(GetTensorShapeAsArray<4>(outputTensorInfo));
259
telsoa01c577f2c2018-08-31 09:22:23 +0100260 // Min/max random values passed to MakeRandomTensor are purposely outside of the ReLu
261 // range [lowerBound, upperBound].
telsoa014fcda012018-03-09 14:13:49 +0000262 auto input = MakeRandomTensor<float, 4>(inputTensorInfo, 4605828, lowerBound - 5.0f, upperBound * 2.0f);
263
Keith Davis33a626f2020-08-27 15:38:12 +0100264 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
265 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000266
telsoa01c577f2c2018-08-31 09:22:23 +0100267 // Set up bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +0000268 armnn::ActivationQueueDescriptor descriptor;
269 armnn::WorkloadInfo workloadInfo;
270 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
271 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
272 descriptor.m_Parameters = activationDescriptor;
273
274 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
275
276 inputHandle->Allocate();
277 outputHandle->Allocate();
278
279 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
280
281 workload->Execute();
282
283 CopyDataFromITensorHandle(&output[0][0][0][0], outputHandle.get());
284
285 return output;
286}
287
288} // namespace
289
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000290LayerTestResult<float, 4> CompareBoundedReLuTest(
291 armnn::IWorkloadFactory& workloadFactory,
292 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
293 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100294 const armnn::ITensorHandleFactory& tensorHandleFactory,
295 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000296 float upperBound,
297 float lowerBound)
telsoa014fcda012018-03-09 14:13:49 +0000298{
299 LayerTestResult<float, 4> result(BoundedReLuRandomInputTestTraits::GetOutputTensorInfo());
300
301 armnn::ActivationDescriptor activationDescriptor;
302 activationDescriptor.m_Function = armnn::ActivationFunction::BoundedReLu;
303 activationDescriptor.m_A = upperBound;
304 activationDescriptor.m_B = lowerBound;
305
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000306 result.output = BoundedReLuRandomInputTest(
Keith Davis33a626f2020-08-27 15:38:12 +0100307 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, upperBound, activationDescriptor);
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000308 result.outputExpected = BoundedReLuRandomInputTest(
Keith Davis33a626f2020-08-27 15:38:12 +0100309 refWorkloadFactory, nullptr, refTensorHandleFactory, 0.0f, upperBound, activationDescriptor);
telsoa014fcda012018-03-09 14:13:49 +0000310
311 return result;
312}
313
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000314template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000315LayerTestResult<T,4> ConstantLinearActivationTestCommon(
316 armnn::IWorkloadFactory& workloadFactory,
317 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100318 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000319 float qScale = 0.0f,
320 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000321{
Jan Eilers8eb25602020-03-09 12:13:48 +0000322 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000323 unsigned int inputHeight = 20;
324 unsigned int inputWidth = 17;
325 unsigned int inputChannels = 3;
326 unsigned int batchSize = 5;
327
328 armnn::TensorInfo inputTensorInfo;
329 armnn::TensorInfo outputTensorInfo;
330
331 unsigned int shape[] = {batchSize, inputChannels, inputHeight, inputWidth};
332
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000333 inputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
334 outputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000335
336 // Set quantization parameters if the requested type is a quantized type.
337 if(armnn::IsQuantizedType<T>())
338 {
339 inputTensorInfo.SetQuantizationScale(qScale);
340 inputTensorInfo.SetQuantizationOffset(qOffset);
341 outputTensorInfo.SetQuantizationScale(qScale);
342 outputTensorInfo.SetQuantizationOffset(qOffset);
343 }
344
345 LayerTestResult<T, 4> ret(outputTensorInfo);
Keith Davis33a626f2020-08-27 15:38:12 +0100346 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
347 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000348
telsoa01c577f2c2018-08-31 09:22:23 +0100349 // Do linear activation that should leave the tensor unchanged.
telsoa014fcda012018-03-09 14:13:49 +0000350 armnn::ActivationQueueDescriptor data;
351 armnn::WorkloadInfo info;
352 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
353 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
354 data.m_Parameters.m_A = 1.0f;
355 data.m_Parameters.m_B = 0.0f;
356 data.m_Parameters.m_Function = armnn::ActivationFunction::Linear;
357
358 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(data, info);
359
360 inputHandle->Allocate();
361 outputHandle->Allocate();
362
363 boost::multi_array<T, 4> input = MakeRandomTensor<T, 4>(inputTensorInfo, 7123561);
364 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
365
366 workload->Execute();
367
368 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
369
telsoa01c577f2c2018-08-31 09:22:23 +0100370 // Ensure output equals input.
telsoa014fcda012018-03-09 14:13:49 +0000371 ret.outputExpected = input;
372
373 return ret;
374}
375
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000376LayerTestResult<float, 4> ConstantLinearActivationTest(
377 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100378 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
379 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000380{
Keith Davis33a626f2020-08-27 15:38:12 +0100381 return ConstantLinearActivationTestCommon<armnn::DataType::Float32>(workloadFactory,
382 memoryManager,
383 tensorHandleFactory);
telsoa014fcda012018-03-09 14:13:49 +0000384}
385
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000386LayerTestResult<uint8_t, 4> ConstantLinearActivationUint8Test(
387 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100388 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
389 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000390{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000391 return ConstantLinearActivationTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100392 workloadFactory, memoryManager, tensorHandleFactory, 4.0f, 3);
telsoa014fcda012018-03-09 14:13:49 +0000393}
394
Teresa Charlin18515e22019-04-24 10:17:46 +0100395LayerTestResult<int16_t, 4> ConstantLinearActivationInt16Test(
396 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100397 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
398 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100399{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000400 return ConstantLinearActivationTestCommon<armnn::DataType::QSymmS16>(
Keith Davis33a626f2020-08-27 15:38:12 +0100401 workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100402}
403
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000404template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000405LayerTestResult<T, 4> SimpleActivationTest(
406 armnn::IWorkloadFactory& workloadFactory,
407 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100408 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000409 armnn::ActivationFunction activationFunction,
410 float activationParameterA,
411 float activationParameterB,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100412 float scale,
413 int32_t offset,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000414 const std::vector<float>& inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100415 float outScale,
416 int32_t outOffset,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000417 const std::vector<float>& outputExpectedData)
telsoa014fcda012018-03-09 14:13:49 +0000418{
Jan Eilers8eb25602020-03-09 12:13:48 +0000419 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000420 constexpr static unsigned int inputWidth = 16u;
421 constexpr static unsigned int inputHeight = 1u;
422 constexpr static unsigned int inputChannels = 1u;
423 constexpr static unsigned int inputBatchSize = 1u;
424
425 constexpr static unsigned int outputWidth = inputWidth;
426 constexpr static unsigned int outputHeight = inputHeight;
427 constexpr static unsigned int outputChannels = inputChannels;
428 constexpr static unsigned int outputBatchSize = inputBatchSize;
429
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000430 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, ArmnnType);
431 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000432
433 // Set quantization parameters if the requested type is a quantized type.
434 if(armnn::IsQuantizedType<T>())
435 {
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100436 inputTensorInfo.SetQuantizationScale(scale);
437 inputTensorInfo.SetQuantizationOffset(offset);
438 outputTensorInfo.SetQuantizationScale(outScale);
439 outputTensorInfo.SetQuantizationOffset(outOffset);
telsoa014fcda012018-03-09 14:13:49 +0000440 }
441
442 LayerTestResult<T, 4> result(inputTensorInfo);
443
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100444 auto input = MakeTensor<T, 4>(inputTensorInfo, armnnUtils::QuantizedVector<T>(inputData, scale, offset));
telsoa014fcda012018-03-09 14:13:49 +0000445
Keith Davis33a626f2020-08-27 15:38:12 +0100446 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
447 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000448
telsoa01c577f2c2018-08-31 09:22:23 +0100449 // Setup bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +0000450 armnn::ActivationQueueDescriptor descriptor;
451 armnn::WorkloadInfo workloadInfo;
452 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
453 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
454
455 descriptor.m_Parameters.m_Function = activationFunction;
456 descriptor.m_Parameters.m_A = activationParameterA;
457 descriptor.m_Parameters.m_B = activationParameterB;
458
459 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
460
461 inputHandle->Allocate();
462 outputHandle->Allocate();
463
464 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
465
466 workload->Execute();
467
468 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
469
telsoa01c577f2c2018-08-31 09:22:23 +0100470 // Calculated manually.
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100471 result.outputExpected =
472 MakeTensor<T, 4>(outputTensorInfo, armnnUtils::QuantizedVector<T>(outputExpectedData, outScale, outOffset));
telsoa014fcda012018-03-09 14:13:49 +0000473
474 return result;
475}
476
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000477template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000478LayerTestResult<T, 4> SimpleSigmoidTestCommon(
479 armnn::IWorkloadFactory& workloadFactory,
480 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100481 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000482 float qScale,
483 int32_t qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000484{
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100485 std::vector<float> inputData =
486 {
telsoa014fcda012018-03-09 14:13:49 +0000487 -0.1f, -0.2f, -0.3f, -0.4f,
488 0.1f, 0.2f, 0.3f, 0.4f,
489 -1.0f, -2.0f, -3.0f, -4.0f,
490 1.0f, 2.0f, 3.0f, 4.0f
491 };
492
telsoa01c577f2c2018-08-31 09:22:23 +0100493 // Calculate output values for input.
telsoa014fcda012018-03-09 14:13:49 +0000494 auto f = [](float value)
495 {
496 return 1.0f / (1.0f + std::exp(-value));
497 };
498 std::vector<float> outputExpectedData(inputData.size());
499 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
500
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000501 return SimpleActivationTest<ArmnnType>(workloadFactory,
502 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100503 tensorHandleFactory,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000504 armnn::ActivationFunction::Sigmoid,
505 0.f,
506 0.f,
507 qScale,
508 qOffset,
509 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100510 1.f / 256.f,
511 0,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000512 outputExpectedData);
telsoa014fcda012018-03-09 14:13:49 +0000513}
514
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000515LayerTestResult<float, 4> SimpleSigmoidTest(
516 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100517 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
518 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000519{
Keith Davis33a626f2020-08-27 15:38:12 +0100520 return SimpleSigmoidTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager,
521 tensorHandleFactory, 0.0f, 0);
telsoa014fcda012018-03-09 14:13:49 +0000522}
523
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000524LayerTestResult<uint8_t, 4> SimpleSigmoidUint8Test(
525 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100526 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
527 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000528{
Keith Davis33a626f2020-08-27 15:38:12 +0100529 return SimpleSigmoidTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
530 tensorHandleFactory, 0.1f, 50);
telsoa014fcda012018-03-09 14:13:49 +0000531}
532
Teresa Charlin18515e22019-04-24 10:17:46 +0100533LayerTestResult<int16_t, 4> SimpleSigmoidInt16Test(
534 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100535 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
536 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100537{
Keith Davis33a626f2020-08-27 15:38:12 +0100538 return SimpleSigmoidTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager,
539 tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100540}
541
542template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
543LayerTestResult<T, 4> ReLuTestCommon(
544 armnn::IWorkloadFactory& workloadFactory,
545 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100546 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100547 float qScale,
548 int32_t qOffset)
549{
550 std::vector<float> inputData = {
551 -0.1f, -0.2f, -0.3f, -0.4f,
552 0.1f, 0.2f, 0.3f, 0.4f,
553 -1.0f, -2.0f, -3.0f, -4.0f,
554 1.0f, 2.0f, 3.0f, 4.0f
555 };
556
557 // Calculate output values for input.
558 auto f = [](float value)
559 {
560 return std::fmax(0.0f, value);
561 };
562 std::vector<float> outputExpectedData(inputData.size());
563 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
564
565 return SimpleActivationTest<ArmnnType>(workloadFactory,
566 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100567 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100568 armnn::ActivationFunction::ReLu,
569 0.f,
570 0.f,
571 qScale,
572 qOffset,
573 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100574 qScale,
575 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100576 outputExpectedData);
577}
578
579LayerTestResult<int16_t, 4> ReLuInt16Test(
580 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100581 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
582 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100583{
Keith Davis33a626f2020-08-27 15:38:12 +0100584 return ReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100585}
586
587
konsof017f6db402019-06-07 15:15:58 +0100588LayerTestResult<uint8_t, 4> ReLuUint8Test(
589 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100590 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
591 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100592{
Keith Davis33a626f2020-08-27 15:38:12 +0100593 return ReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100594}
595
596LayerTestResult<float, 4> ReLuTest(
597 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100598 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
599 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100600{
Keith Davis33a626f2020-08-27 15:38:12 +0100601 return ReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100602}
603
604
Teresa Charlin18515e22019-04-24 10:17:46 +0100605template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
606LayerTestResult<T, 4> BoundedReLuTestCommon(
607 armnn::IWorkloadFactory& workloadFactory,
608 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100609 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100610 float qScale,
611 int32_t qOffset)
612{
613 std::vector<float> inputData = {
614 -0.1f, -0.2f, -0.3f, -0.4f,
615 0.1f, 0.2f, 0.3f, 0.4f,
616 -1.0f, -2.0f, -3.0f, -4.0f,
617 1.0f, 2.0f, 3.0f, 4.0f
618 };
619 const float a = 1.0f;
620 const float b = -1.0f;
621 // Calculate output values for input.
622 auto f = [a, b](float value)
623 {
624 return std::min(a, std::max(b, value));
625 };
626 std::vector<float> outputExpectedData(inputData.size());
627 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
628
629 return SimpleActivationTest<ArmnnType>(workloadFactory,
630 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100631 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100632 armnn::ActivationFunction::BoundedReLu,
633 a,
634 b,
635 qScale,
636 qOffset,
637 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100638 qScale,
639 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100640 outputExpectedData);
641}
642
643LayerTestResult<int16_t, 4> BoundedReLuInt16Test(
644 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100645 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
646 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100647{
Keith Davis33a626f2020-08-27 15:38:12 +0100648 return ReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100649}
650
651
652
653template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
654LayerTestResult<T, 4> SoftReLuTestCommon(
655 armnn::IWorkloadFactory& workloadFactory,
656 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100657 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100658 float qScale,
659 int32_t qOffset)
660{
661 std::vector<float> inputData = {
662 -0.1f, -0.2f, -0.3f, -0.4f,
663 0.1f, 0.2f, 0.3f, 0.4f,
664 -1.0f, -2.0f, -3.0f, -4.0f,
665 1.0f, 2.0f, 3.0f, 4.0f
666 };
667
668 // Calculate output values for input.
669 auto f = [](float value)
670 {
671 return std::log(1.0f + std::exp(value));
672 };
673 std::vector<float> outputExpectedData(inputData.size());
674 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
675
676 return SimpleActivationTest<ArmnnType>(workloadFactory,
677 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100678 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100679 armnn::ActivationFunction::SoftReLu,
680 0.f,
681 0.f,
682 qScale,
683 qOffset,
684 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100685 qScale,
686 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100687 outputExpectedData);
688}
689
konsof017f6db402019-06-07 15:15:58 +0100690LayerTestResult<float, 4> SoftReLuTest(
691 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100692 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
693 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100694{
Keith Davis33a626f2020-08-27 15:38:12 +0100695 return SoftReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100696}
697
698LayerTestResult<uint8_t, 4> SoftReLuUint8Test(
699 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100700 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
701 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100702{
Keith Davis33a626f2020-08-27 15:38:12 +0100703 return SoftReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
704 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100705}
706
Teresa Charlin18515e22019-04-24 10:17:46 +0100707LayerTestResult<int16_t, 4> SoftReLuInt16Test(
708 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100709 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
710 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100711{
Keith Davis33a626f2020-08-27 15:38:12 +0100712 return SoftReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100713}
714
715template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
716LayerTestResult<T, 4> LeakyReLuTestCommon(
717 armnn::IWorkloadFactory& workloadFactory,
718 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100719 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100720 float qScale,
721 int32_t qOffset)
722{
723 std::vector<float> inputData = {
724 -0.1f, -0.2f, -0.3f, -0.4f,
725 0.1f, 0.2f, 0.3f, 0.4f,
726 -1.0f, -2.0f, -3.0f, -4.0f,
727 1.0f, 2.0f, 3.0f, 4.0f
728 };
729
730 const float a = 0.01f;
731 // Calculate output values for input.
732 auto f = [a](float value)
733 {
734 return value > 0.0f ? value : (value * a);
735 };
736 std::vector<float> outputExpectedData(inputData.size());
737 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
738
739 return SimpleActivationTest<ArmnnType>(workloadFactory,
740 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100741 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100742 armnn::ActivationFunction::LeakyReLu,
743 a,
744 0.f,
745 qScale,
746 qOffset,
747 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100748 qScale,
749 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100750 outputExpectedData);
751}
752
konsof017f6db402019-06-07 15:15:58 +0100753LayerTestResult<float, 4> LeakyReLuTest(
754 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100755 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
756 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100757{
Keith Davis33a626f2020-08-27 15:38:12 +0100758 return LeakyReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100759}
760
761LayerTestResult<uint8_t, 4> LeakyReLuUint8Test(
762 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100763 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
764 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100765{
Keith Davis33a626f2020-08-27 15:38:12 +0100766 return LeakyReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
767 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100768}
769
Teresa Charlin18515e22019-04-24 10:17:46 +0100770LayerTestResult<int16_t, 4> LeakyReLuInt16Test(
771 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100772 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
773 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100774{
Keith Davis33a626f2020-08-27 15:38:12 +0100775 return LeakyReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100776}
777
778template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
779LayerTestResult<T, 4> AbsTestCommon(
780 armnn::IWorkloadFactory& workloadFactory,
781 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100782 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100783 float qScale,
784 int32_t qOffset)
785{
786 std::vector<float> inputData = {
787 -0.1f, -0.2f, -0.3f, -0.4f,
788 0.1f, 0.2f, 0.3f, 0.4f,
789 -1.0f, -2.0f, -3.0f, -4.0f,
790 1.0f, 2.0f, 3.0f, 4.0f
791 };
792
793 // Calculate output values for input.
794 auto f = [](float value)
795 {
796 return std::abs(value);
797 };
798 std::vector<float> outputExpectedData(inputData.size());
799 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
800
801 return SimpleActivationTest<ArmnnType>(workloadFactory,
802 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100803 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100804 armnn::ActivationFunction::Abs,
805 0.f,
806 0.f,
807 qScale,
808 qOffset,
809 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100810 qScale,
811 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100812 outputExpectedData);
813}
814
konsof017f6db402019-06-07 15:15:58 +0100815LayerTestResult<float, 4> AbsTest(
816 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100817 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
818 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100819{
Keith Davis33a626f2020-08-27 15:38:12 +0100820 return AbsTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100821}
822
823LayerTestResult<uint8_t, 4> AbsUint8Test(
824 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100825 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
826 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100827{
Keith Davis33a626f2020-08-27 15:38:12 +0100828 return AbsTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100829}
830
Teresa Charlin18515e22019-04-24 10:17:46 +0100831LayerTestResult<int16_t, 4> AbsInt16Test(
832 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100833 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
834 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100835{
Keith Davis33a626f2020-08-27 15:38:12 +0100836 return AbsTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100837}
838
Sadik Armagan6095ba52019-09-13 17:07:19 +0100839LayerTestResult<float, 5> SqrtNNTest(
840 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100841 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
842 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan6095ba52019-09-13 17:07:19 +0100843{
Jan Eilers8eb25602020-03-09 12:13:48 +0000844 IgnoreUnused(memoryManager);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100845 const int inputDataSize = 120;
846 std::vector<float> inputData(inputDataSize);
847
848 for (unsigned int i = 0u; i < inputDataSize; ++i)
849 {
850 inputData[i] = static_cast<float>(i) / 10;
851 }
852
853 auto f = [](float value)
854 {
855 return std::sqrt(value);
856 };
857 std::vector<float> outputExpectedData(inputDataSize);
858 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
859
860 armnn::TensorInfo inputTensorInfo(
861 { 1u, 2u, 3u, 4u, 5u }, armnn::DataType::Float32);
862 armnn::TensorInfo outputTensorInfo(
863 { 1u, 2u, 3u, 4u, 5u }, armnn::DataType::Float32);
864
865 LayerTestResult<float, 5> result(inputTensorInfo);
866
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100867 auto input = MakeTensor<float, 5>(inputTensorInfo, inputData);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100868
Keith Davis33a626f2020-08-27 15:38:12 +0100869 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
870 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100871
872 armnn::ActivationQueueDescriptor descriptor;
873 armnn::WorkloadInfo workloadInfo;
874 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
875 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
876
877 descriptor.m_Parameters.m_Function = armnn::ActivationFunction::Sqrt;
878
879 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
880
881 inputHandle->Allocate();
882 outputHandle->Allocate();
883
884 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0][0]);
885
886 workload->Execute();
887
888 CopyDataFromITensorHandle(&result.output[0][0][0][0][0], outputHandle.get());
889
890 // Calculated manually.
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100891 result.outputExpected = MakeTensor<float, 5>(outputTensorInfo, outputExpectedData);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100892
893 return result;
894};
895
Teresa Charlin18515e22019-04-24 10:17:46 +0100896template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
897LayerTestResult<T, 4> SqrtTestCommon(
898 armnn::IWorkloadFactory& workloadFactory,
899 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100900 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100901 float qScale,
902 int32_t qOffset)
903{
904 std::vector<float> inputData = {
905 0.1f, 0.2f, 0.3f, 0.4f,
906 0.1f, 0.2f, 0.3f, 0.4f,
907 1.0f, 2.0f, 3.0f, 4.0f,
908 1.0f, 2.0f, 3.0f, 4.0f
909 };
910
911 // Calculate output values for input.
912 auto f = [](float value)
913 {
914 return std::sqrt(value);
915 };
916 std::vector<float> outputExpectedData(inputData.size());
917 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
918
919 return SimpleActivationTest<ArmnnType>(workloadFactory,
920 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100921 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100922 armnn::ActivationFunction::Sqrt,
923 0.f,
924 0.f,
925 qScale,
926 qOffset,
927 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100928 qScale,
929 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100930 outputExpectedData);
931}
932
konsof017f6db402019-06-07 15:15:58 +0100933LayerTestResult<float, 4> SqrtTest(
934 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100935 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
936 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100937{
Keith Davis33a626f2020-08-27 15:38:12 +0100938 return SqrtTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100939}
940
941LayerTestResult<uint8_t, 4> SqrtUint8Test(
942 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100943 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
944 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100945{
Keith Davis33a626f2020-08-27 15:38:12 +0100946 return SqrtTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100947}
948
Teresa Charlin18515e22019-04-24 10:17:46 +0100949LayerTestResult<int16_t, 4> SqrtInt16Test(
950 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100951 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
952 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100953{
Keith Davis33a626f2020-08-27 15:38:12 +0100954 return SqrtTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100955}
956
957template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
958LayerTestResult<T, 4> SquareTestCommon(
959 armnn::IWorkloadFactory& workloadFactory,
960 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100961 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100962 float qScale,
963 int32_t qOffset)
964{
965 std::vector<float> inputData = {
966 -0.1f, -0.2f, -0.3f, -0.4f,
967 0.1f, 0.2f, 0.3f, 0.4f,
968 -1.0f, -2.0f, -3.0f, -4.0f,
969 1.0f, 2.0f, 3.0f, 4.0f
970 };
971
972 // Calculate output values for input.
973 auto f = [](float value)
974 {
975 return std::pow(value,2);
976 };
977 std::vector<float> outputExpectedData(inputData.size());
978 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
979
980 return SimpleActivationTest<ArmnnType>(workloadFactory,
981 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100982 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100983 armnn::ActivationFunction::Square,
984 0.f,
985 0.f,
986 qScale,
987 qOffset,
988 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100989 qScale,
990 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +0100991 outputExpectedData);
992}
993
konsof017f6db402019-06-07 15:15:58 +0100994LayerTestResult<float, 4> SquareTest(
995 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100996 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
997 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100998{
Keith Davis33a626f2020-08-27 15:38:12 +0100999 return SquareTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +01001000}
1001
1002LayerTestResult<uint8_t, 4> SquareUint8Test(
1003 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001004 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1005 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001006{
Keith Davis33a626f2020-08-27 15:38:12 +01001007 return SquareTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
1008 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +01001009}
1010
Teresa Charlin18515e22019-04-24 10:17:46 +01001011LayerTestResult<int16_t, 4> SquareInt16Test(
1012 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001013 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1014 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +01001015{
Keith Davis33a626f2020-08-27 15:38:12 +01001016 return SquareTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001017}
1018
1019template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1020LayerTestResult<T, 4> TanhTestCommon(
1021 armnn::IWorkloadFactory& workloadFactory,
1022 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001023 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001024 float qScale,
1025 int32_t qOffset)
1026{
1027 std::vector<float> inputData = {
1028 -0.1f, -0.2f, -0.3f, -0.4f,
1029 0.1f, 0.2f, 0.3f, 0.4f,
1030 -1.0f, -2.0f, -3.0f, -4.0f,
1031 1.0f, 2.0f, 3.0f, 4.0f
1032 };
1033
1034 const float a = 2.0f;
1035 const float b = 3.0f;
1036 // Calculate output values for input.
1037 auto f = [a, b](float value)
1038 {
1039 return a * tanhf(b * value);
1040 };
1041 std::vector<float> outputExpectedData(inputData.size());
1042 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
1043
1044 return SimpleActivationTest<ArmnnType>(workloadFactory,
1045 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001046 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001047 armnn::ActivationFunction::TanH,
1048 a,
1049 b,
1050 qScale,
1051 qOffset,
1052 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +01001053 qScale,
1054 qOffset,
Teresa Charlin18515e22019-04-24 10:17:46 +01001055 outputExpectedData);
1056}
1057
konsof017f6db402019-06-07 15:15:58 +01001058LayerTestResult<float, 4> TanhTest(
1059 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001060 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1061 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001062{
Keith Davis33a626f2020-08-27 15:38:12 +01001063 return TanhTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +01001064}
1065
1066LayerTestResult<uint8_t, 4> TanhUint8Test(
1067 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001068 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1069 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001070{
Keith Davis33a626f2020-08-27 15:38:12 +01001071 return TanhTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 64);
konsof017f6db402019-06-07 15:15:58 +01001072}
1073
Teresa Charlin18515e22019-04-24 10:17:46 +01001074LayerTestResult<int16_t, 4> TanhInt16Test(
1075 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001076 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1077 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +01001078{
Keith Davis33a626f2020-08-27 15:38:12 +01001079 return TanhTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001080}
1081
1082
David Monahan3b3c3812020-02-25 09:03:29 +00001083template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1084LayerTestResult<T, 4> EluTestCommon(
1085 armnn::IWorkloadFactory& workloadFactory,
1086 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001087 const armnn::ITensorHandleFactory& tensorHandleFactory,
David Monahan3b3c3812020-02-25 09:03:29 +00001088 float qScale,
1089 int32_t qOffset)
1090{
1091 std::vector<float> inputData = {
1092 -0.1f, -0.2f, -0.3f, -0.4f,
1093 0.1f, 0.2f, 0.3f, 0.4f,
1094 -1.0f, -2.0f, -3.0f, -4.0f,
1095 1.0f, 2.0f, 3.0f, 4.0f
1096 };
1097
1098
1099 const float a = 0.01f;
1100 // Calculate output values for input.
1101 auto f = [a](float value)
1102 {
1103 return (value >= 0) ? value : a * (expf(value) - 1);
1104 };
1105 std::vector<float> outputExpectedData(inputData.size());
1106 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
1107
1108 return SimpleActivationTest<ArmnnType>(workloadFactory,
1109 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001110 tensorHandleFactory,
David Monahan3b3c3812020-02-25 09:03:29 +00001111 armnn::ActivationFunction::Elu,
1112 a,
1113 0.0f,
1114 qScale,
1115 qOffset,
1116 inputData,
1117 qScale,
1118 qOffset,
1119 outputExpectedData);
1120}
1121
1122LayerTestResult<float, 4> EluTest(
1123 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001124 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1125 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001126{
Keith Davis33a626f2020-08-27 15:38:12 +01001127 return EluTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
David Monahan3b3c3812020-02-25 09:03:29 +00001128}
1129
1130LayerTestResult<uint8_t, 4> EluUint8Test(
1131 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001132 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1133 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001134{
Keith Davis33a626f2020-08-27 15:38:12 +01001135 return EluTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 64);
David Monahan3b3c3812020-02-25 09:03:29 +00001136}
1137
1138LayerTestResult<int16_t, 4> EluInt16Test(
1139 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001140 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1141 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001142{
Keith Davis33a626f2020-08-27 15:38:12 +01001143 return EluTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
David Monahan3b3c3812020-02-25 09:03:29 +00001144}
1145
Teresa Charlin18515e22019-04-24 10:17:46 +01001146
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001147template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001148LayerTestResult<T, 4> HardSwishTestCommon(
1149 armnn::IWorkloadFactory& workloadFactory,
1150 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001151 const armnn::ITensorHandleFactory& tensorHandleFactory,
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001152 float qScale,
1153 int32_t qOffset)
1154{
1155 std::vector<float> inputData = {
1156 -0.1f, -0.2f, -0.3f, -0.4f,
1157 0.1f, 0.2f, 0.3f, 0.4f,
1158 -1.0f, -2.0f, -3.0f, -4.0f,
1159 1.0f, 2.0f, 3.0f, 4.0f
1160 };
1161 // Calculate output values for input.
1162 auto f = [](float x)
1163 {
1164 // Break down the calculation to help with verification.
1165 // hard_swish(x) = x * relu6(x+3) / 6
1166 // relu6(x) = min(max(x,0),6)
1167 float reLu6_step1 = std::max((x + 3),0.0f);
1168 float reLu6Complete = std::min(reLu6_step1, 6.0f);
1169 float hardSwish_step1 = x * reLu6Complete;
1170 float result = hardSwish_step1 / 6;
1171 return result;
1172 };
1173 std::vector<float> outputExpectedData(inputData.size());
1174 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
1175
1176 return SimpleActivationTest<ArmnnType>(workloadFactory,
1177 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001178 tensorHandleFactory,
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001179 armnn::ActivationFunction::HardSwish,
1180 0.f,
1181 0.f,
1182 qScale,
1183 qOffset,
1184 inputData,
1185 qScale,
1186 qOffset,
1187 outputExpectedData);
1188}
1189
1190LayerTestResult<float, 4> HardSwishTest(
1191 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001192 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1193 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001194{
Keith Davis33a626f2020-08-27 15:38:12 +01001195 return HardSwishTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001196}
1197
1198LayerTestResult<uint8_t, 4> HardSwishUint8Test(
1199 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001200 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1201 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001202{
Keith Davis33a626f2020-08-27 15:38:12 +01001203 return HardSwishTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
1204 tensorHandleFactory, 0.1f, 64);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001205}
1206
1207LayerTestResult<int16_t, 4> HardSwishInt16Test(
1208 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001209 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1210 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001211{
Keith Davis33a626f2020-08-27 15:38:12 +01001212 return HardSwishTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001213}
1214
1215
1216template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001217LayerTestResult<T,4> CompareActivationTestImpl(
1218 armnn::IWorkloadFactory& workloadFactory,
1219 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1220 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001221 const armnn::ITensorHandleFactory& tensorHandleFactory,
1222 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001223 armnn::ActivationFunction f,
1224 unsigned int batchSize = 5,
1225 float qScale = 0.0f,
1226 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001227{
Jan Eilers8eb25602020-03-09 12:13:48 +00001228 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +00001229 unsigned int width = 17;
1230 unsigned int height = 29;
1231 unsigned int channels = 2;
1232
1233 float a = 0.234f;
1234 float b = -12.345f;
1235
1236 armnn::TensorInfo inputTensorInfo;
1237 armnn::TensorInfo outputTensorInfo;
1238
1239 unsigned int shape[] = {batchSize, channels, height, width};
1240
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001241 inputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
1242 outputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001243
1244 // Set quantization parameters if the requested type is a quantized type.
1245 if(armnn::IsQuantizedType<T>())
1246 {
1247 inputTensorInfo.SetQuantizationScale(qScale);
1248 inputTensorInfo.SetQuantizationOffset(qOffset);
1249 outputTensorInfo.SetQuantizationScale(qScale);
1250 outputTensorInfo.SetQuantizationOffset(qOffset);
1251 }
1252
1253 float minVal = -10.f;
1254 if (f == armnn::ActivationFunction::Sqrt)
1255 {
1256 minVal = 0.f;
1257 }
1258
1259 boost::multi_array<T, 4> input = MakeRandomTensor<T, 4>(inputTensorInfo, 21453, minVal, 10.f);
1260
1261
1262 LayerTestResult<T,4> ret(outputTensorInfo);
1263 auto boostArrayExtents = boost::extents
1264 [boost::numeric_cast<boost::multi_array_types::extent_gen::index>(batchSize)]
1265 [boost::numeric_cast<boost::multi_array_types::extent_gen::index>(channels)]
1266 [boost::numeric_cast<boost::multi_array_types::extent_gen::index>(height)]
1267 [boost::numeric_cast<boost::multi_array_types::extent_gen::index>(width)];
1268 ret.output.resize(boostArrayExtents);
1269 ret.outputExpected.resize(boostArrayExtents);
1270
Keith Davis33a626f2020-08-27 15:38:12 +01001271 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
1272 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +00001273
Keith Davis33a626f2020-08-27 15:38:12 +01001274 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refTensorHandleFactory.CreateTensorHandle(inputTensorInfo);
1275 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refTensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +00001276
1277 armnn::ActivationQueueDescriptor data;
1278 armnn::WorkloadInfo info;
1279 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
1280 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1281 data.m_Parameters.m_A = a;
1282 data.m_Parameters.m_B = b;
1283 data.m_Parameters.m_Function = f;
1284
1285 armnn::ActivationQueueDescriptor refData = data;
1286 armnn::WorkloadInfo refInfo = info;
1287 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
1288 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
1289
1290 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(data, info);
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001291 ARMNN_ASSERT(workload != nullptr);
telsoa014fcda012018-03-09 14:13:49 +00001292 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateActivation(refData, refInfo);
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001293 ARMNN_ASSERT(workloadRef != nullptr);
telsoa014fcda012018-03-09 14:13:49 +00001294
1295 inputHandle->Allocate();
1296 outputHandle->Allocate();
1297 inputHandleRef->Allocate();
1298 outputHandleRef->Allocate();
1299
1300 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
1301 CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
1302
1303 workload->Execute();
1304 workloadRef->Execute();
1305
1306 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
1307 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
1308
1309 return ret;
1310}
1311
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001312LayerTestResult<float,4> CompareActivationTest(
1313 armnn::IWorkloadFactory& workloadFactory,
1314 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1315 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001316 const armnn::ITensorHandleFactory& tensorHandleFactory,
1317 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001318 armnn::ActivationFunction f,
1319 unsigned int batchSize)
telsoa014fcda012018-03-09 14:13:49 +00001320{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001321 return CompareActivationTestImpl<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +01001322 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory,
1323 refTensorHandleFactory, f, batchSize);
telsoa014fcda012018-03-09 14:13:49 +00001324}
1325
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001326LayerTestResult<uint8_t,4> CompareActivationUint8Test(
1327 armnn::IWorkloadFactory& workloadFactory,
1328 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1329 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001330 const armnn::ITensorHandleFactory& tensorHandleFactory,
1331 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001332 armnn::ActivationFunction f)
telsoa014fcda012018-03-09 14:13:49 +00001333{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001334 return CompareActivationTestImpl<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +01001335 workloadFactory, memoryManager, refWorkloadFactory,
1336 tensorHandleFactory, refTensorHandleFactory, f, 5, 0.1f, 50);
telsoa014fcda012018-03-09 14:13:49 +00001337}
Teresa Charlin18515e22019-04-24 10:17:46 +01001338
1339LayerTestResult<int16_t,4> CompareActivationInt16Test(
1340 armnn::IWorkloadFactory& workloadFactory,
1341 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1342 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001343 const armnn::ITensorHandleFactory& tensorHandleFactory,
1344 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001345 armnn::ActivationFunction f)
1346{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001347 return CompareActivationTestImpl<armnn::DataType::QSymmS16>(
Keith Davis33a626f2020-08-27 15:38:12 +01001348 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory,
1349 refTensorHandleFactory, f, 5, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001350}