blob: 620c299803c64401ee7db3b54b4330428f867fc8 [file] [log] [blame]
David Monahan0cf84422020-11-16 15:53:03 +00001//
Teresa Charlinad1b3d72023-03-14 12:10:28 +00002// Copyright © 2020, 2023 Arm Ltd and Contributors. All rights reserved.
David Monahan0cf84422020-11-16 15:53:03 +00003// SPDX-License-Identifier: MIT
4//
5
6#include "ActivationTestHelper.hpp"
7
8#include <armnn_delegate.hpp>
9
10#include <flatbuffers/flatbuffers.h>
11#include <tensorflow/lite/interpreter.h>
Teresa Charlinad1b3d72023-03-14 12:10:28 +000012#include <schema_generated.h>
David Monahan0cf84422020-11-16 15:53:03 +000013
14#include <doctest/doctest.h>
15
16namespace armnnDelegate
17{
18
19
20void ActivationReLuTest(std::vector<armnn::BackendId>& backends)
21{
David Monahan0cf84422020-11-16 15:53:03 +000022 std::vector<float> inputData = {
23 -0.1f, -0.2f, -0.3f, -0.4f,
24 0.1f, 0.2f, 0.3f, 0.4f,
25 -1.0f, -2.0f, -3.0f, -4.0f,
26 1.0f, 2.0f, 3.0f, 4.0f
27 };
28
29 // Calculate output values for input.
30 auto f = [](float value)
31 {
32 return std::fmax(0.0f, value);
33 };
34 std::vector<float> outputExpectedData(inputData.size());
35 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
36
37 ActivationTest(tflite::BuiltinOperator_RELU,
38 backends,
39 inputData,
40 outputExpectedData);
41}
42
43void ActivationBoundedReluTest(std::vector<armnn::BackendId>& backends)
44{
45 std::vector<float> inputData = {
46 -0.1f, -0.2f, -0.3f, -0.4f,
47 0.1f, 0.2f, 0.3f, 0.4f,
48 -1.0f, -2.0f, -3.0f, -4.0f,
49 1.0f, 2.0f, 3.0f, 4.0f
50 };
51
52 const float a = 6.0f;
53 const float b = 0.0f;
54 // Calculate output values for input.
55 auto f = [a, b](float value)
56 {
57 return std::min(a, std::max(b, value));
58 };
59 std::vector<float> outputExpectedData(inputData.size());
60 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
61
62 ActivationTest(tflite::BuiltinOperator_RELU6,
63 backends,
64 inputData,
65 outputExpectedData);
66}
67
68void ActivationSigmoidTest(std::vector<armnn::BackendId>& backends)
69{
70 std::vector<float> inputData = {
71 -0.1f, -0.2f, -0.3f, -0.4f,
72 0.1f, 0.2f, 0.3f, 0.4f,
73 -1.0f, -2.0f, -3.0f, -4.0f,
74 1.0f, 2.0f, 3.0f, 4.0f
75 };
76
77 // Calculate output values for input.
78 auto f = [](float value)
79 {
80 return 1.0f / (1.0f + std::exp(-value));
81 };
82 std::vector<float> outputExpectedData(inputData.size());
83 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
84
85 ActivationTest(tflite::BuiltinOperator_LOGISTIC,
86 backends,
87 inputData,
88 outputExpectedData);
89}
90
91
92void ActivationTanHTest(std::vector<armnn::BackendId>& backends)
93{
94 std::vector<float> inputData = {
95 -0.1f, -0.2f, -0.3f, -0.4f,
96 0.1f, 0.2f, 0.3f, 0.4f,
97 -1.0f, -2.0f, -3.0f, -4.0f,
98 1.0f, 2.0f, 3.0f, 4.0f
99 };
100
101 // Calculate output values for input.
102 auto f = [](float value)
103 {
104 return tanhf(value);
105 };
106 std::vector<float> outputExpectedData(inputData.size());
107 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
108
109 ActivationTest(tflite::BuiltinOperator_TANH,
110 backends,
111 inputData,
112 outputExpectedData);
113}
114
Matthew Sloyan7515d072020-12-16 12:50:01 +0000115void ActivationEluTest(std::vector<armnn::BackendId>& backends)
116{
117 std::vector<float> inputData = {
118 -0.1f, -0.2f, -0.3f, -0.4f,
119 0.1f, 0.2f, 0.3f, 0.4f,
120 -1.0f, -2.0f, -3.0f, -4.0f,
121 1.0f, 2.0f, 3.0f, 4.0f
122 };
123
124 // Calculate output values for input.
125 auto f = [](float value)
126 {
127 if (value < 0)
128 {
129 // alpha * (exp(x) - 1)
130 return 1 * (std::exp(value) - 1);
131 }
132 return value;
133 };
134 std::vector<float> outputExpectedData(inputData.size());
135 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
136
137 ActivationTest(tflite::BuiltinOperator_ELU,
138 backends,
139 inputData,
140 outputExpectedData);
141}
142
143void ActivationHardSwishTest(std::vector<armnn::BackendId>& backends)
144{
145 std::vector<float> inputData = {
146 -0.1f, -0.2f, -0.3f, -0.4f,
147 0.1f, 0.2f, 0.3f, 0.4f,
148 -1.0f, -2.0f, -3.0f, -4.0f,
149 1.0f, 2.0f, 3.0f, 4.0f
150 };
151
152 // Calculate output values for input.
153 auto f = [](float x)
154 {
155 // Break down the calculation to help with verification.
156 // hard_swish(x) = x * relu6(x+3) / 6
157 // relu6(x) = min(max(x,0),6)
158 float reLu6_step1 = std::max((x + 3),0.0f);
159 float reLu6Complete = std::min(reLu6_step1, 6.0f);
160 float hardSwish_step1 = x * reLu6Complete;
161 float result = hardSwish_step1 / 6;
162 return result;
163 };
164 std::vector<float> outputExpectedData(inputData.size());
165 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
166
167 ActivationTest(tflite::BuiltinOperator_HARD_SWISH,
168 backends,
169 inputData,
170 outputExpectedData);
171}
172
Tianle Chengae931732023-07-28 11:53:04 +0100173void ActivationLeakyReLuTest(std::vector<armnn::BackendId>& backends)
174{
175 std::vector<float> inputData = {
176 -0.1f, -0.2f, -0.3f, -0.4f,
177 0.1f, 0.2f, 0.3f, 0.4f,
178 -1.0f, -2.0f, -3.0f, -4.0f,
179 1.0f, 2.0f, 3.0f, 4.0f
180 };
181
182 float alpha = 0.3f;
183
184 // Calculate output values for input.
185 auto f = [alpha](float value)
186 {
187 return value > 0 ? value : value * alpha;
188 };
189 std::vector<float> outputExpectedData(inputData.size());
190 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
191
192 ActivationTest(tflite::BuiltinOperator_LEAKY_RELU,
193 backends,
194 inputData,
195 outputExpectedData,
196 alpha);
197}
198
David Monahan0cf84422020-11-16 15:53:03 +0000199TEST_SUITE("Activation_CpuRefTests")
200{
201
202TEST_CASE ("Activation_ReLu_CpuRef_Test")
203{
204 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
205 ActivationReLuTest(backends);
206}
207
208TEST_CASE ("Activation_Bounded_Relu6_CpuRef_Test")
209{
210 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
211 ActivationBoundedReluTest(backends);
212}
213
214TEST_CASE ("Activation_Sigmoid_CpuRef_Test")
215{
216 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
217 ActivationSigmoidTest(backends);
218}
219
David Monahan0cf84422020-11-16 15:53:03 +0000220TEST_CASE ("Activation_TanH_CpuRef_Test")
221{
222 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
223 ActivationTanHTest(backends);
224}
225
Matthew Sloyan7515d072020-12-16 12:50:01 +0000226TEST_CASE ("Activation_Elu_CpuRef_Test")
227{
228 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
229 ActivationEluTest(backends);
230}
231
232TEST_CASE ("Activation_HardSwish_CpuRef_Test")
233{
234 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
235 ActivationHardSwishTest(backends);
236}
237
Tianle Chengae931732023-07-28 11:53:04 +0100238TEST_CASE ("Activation_LeakyRelu_CpuRef_Test")
239{
240 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
241 ActivationLeakyReLuTest(backends);
242}
243
David Monahan0cf84422020-11-16 15:53:03 +0000244}
245
246TEST_SUITE("Activation_CpuAccTests")
247{
248
249TEST_CASE ("Activation_ReLu_CpuAcc_Test")
250{
251 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
252 ActivationReLuTest(backends);
253}
254
255TEST_CASE ("Activation_Bounded_Relu6_CpuAcc_Test")
256{
257 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
258 ActivationBoundedReluTest(backends);
259}
260
261TEST_CASE ("Activation_Sigmoid_CpuAcc_Test")
262{
263 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
264 ActivationSigmoidTest(backends);
265}
266
David Monahan0cf84422020-11-16 15:53:03 +0000267TEST_CASE ("Activation_TanH_CpuAcc_Test")
268{
269 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
270 ActivationTanHTest(backends);
271}
272
Matthew Sloyan7515d072020-12-16 12:50:01 +0000273TEST_CASE ("Activation_Elu_CpuAcc_Test")
274{
275 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
276 ActivationEluTest(backends);
277}
278
279TEST_CASE ("Activation_HardSwish_CpuAcc_Test")
280{
281 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
282 ActivationHardSwishTest(backends);
283}
284
Tianle Chengae931732023-07-28 11:53:04 +0100285TEST_CASE ("Activation_LeakyRelu_CpuAcc_Test")
286{
287 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
288 ActivationLeakyReLuTest(backends);
289}
290
David Monahan0cf84422020-11-16 15:53:03 +0000291}
292
293TEST_SUITE("Activation_GpuAccTests")
294{
295
296TEST_CASE ("Activation_ReLu_GpuAcc_Test")
297{
298 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
299 ActivationReLuTest(backends);
300}
301
302TEST_CASE ("Activation_Bounded_Relu6_GpuAcc_Test")
303{
304 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
305 ActivationBoundedReluTest(backends);
306}
307
308TEST_CASE ("Activation_Sigmoid_GpuAcc_Test")
309{
310 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
311 ActivationSigmoidTest(backends);
312}
313
David Monahan0cf84422020-11-16 15:53:03 +0000314TEST_CASE ("Activation_TanH_GpuAcc_Test")
315{
316 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
317 ActivationTanHTest(backends);
318}
319
Matthew Sloyan7515d072020-12-16 12:50:01 +0000320TEST_CASE ("Activation_Elu_GpuAcc_Test")
321{
322 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
323 ActivationEluTest(backends);
324}
325
326TEST_CASE ("Activation_HardSwish_GpuAcc_Test")
327{
328 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
329 ActivationHardSwishTest(backends);
330}
331
Tianle Chengae931732023-07-28 11:53:04 +0100332TEST_CASE ("Activation_LeakyRelu_GpuAcc_Test")
333{
334 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
335 ActivationLeakyReLuTest(backends);
336}
337
David Monahan0cf84422020-11-16 15:53:03 +0000338}
339
340} // namespace armnnDelegate