1 //
2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "SoftmaxTestHelper.hpp"
7
8 #include <armnn_delegate.hpp>
9
10 #include <flatbuffers/flatbuffers.h>
11 #include <tensorflow/lite/schema/schema_generated.h>
12
13 #include <doctest/doctest.h>
14
15 namespace armnnDelegate
16 {
17
18 /// Convenience function to run softmax and log-softmax test cases
19 /// \param operatorCode tflite::BuiltinOperator_SOFTMAX or tflite::BuiltinOperator_LOG_SOFTMAX
20 /// \param backends armnn backends to target
21 /// \param beta multiplicative parameter to the softmax function
22 /// \param expectedOutput to be checked against transformed input
SoftmaxTestCase(tflite::BuiltinOperator operatorCode,std::vector<armnn::BackendId> backends,float beta,std::vector<float> expectedOutput)23 void SoftmaxTestCase(tflite::BuiltinOperator operatorCode,
24 std::vector<armnn::BackendId> backends, float beta, std::vector<float> expectedOutput) {
25 std::vector<float> input = {
26 1.0, 2.5, 3.0, 4.5, 5.0,
27 -1.0, -2.5, -3.0, -4.5, -5.0};
28 std::vector<int32_t> shape = {2, 5};
29
30 SoftmaxTest(operatorCode,
31 tflite::TensorType_FLOAT32,
32 backends,
33 shape,
34 input,
35 expectedOutput,
36 beta);
37 }
38
39 TEST_SUITE ("Softmax_GpuAccTests")
40 {
41
42 TEST_CASE ("Softmax_Standard_Beta_GpuAcc_Test")
43 {
44 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
45 std::vector<float> expectedOutput = {0.00994190481, 0.0445565246, 0.0734612942, 0.329230666, 0.542809606,
46 0.710742831, 0.158588171, 0.0961885825, 0.0214625746, 0.0130177103};
47 SoftmaxTestCase(tflite::BuiltinOperator_SOFTMAX, backends, 1, expectedOutput);
48 }
49
50 TEST_CASE ("Softmax_Different_Beta_GpuAcc_Test")
51 {
52 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
53 std::vector<float> expectedOutput = {0.0946234912, 0.148399189, 0.172415257, 0.270400971, 0.314161092, 0.352414012,
54 0.224709094, 0.193408906, 0.123322964, 0.106145054};
55 SoftmaxTestCase(tflite::BuiltinOperator_SOFTMAX, backends, 0.3, expectedOutput);
56
57 }
58
59 TEST_CASE ("Log_Softmax_GpuAcc_Test")
60 {
61 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
62 std::vector<float> expectedOutput =
63 {-4.61099672, -3.11099672, -2.61099672, -1.11099672, -0.610996664,
64 -0.341444582, -1.84144461, -2.34144449, -3.84144449, -4.34144449};
65 SoftmaxTestCase(tflite::BuiltinOperator_LOG_SOFTMAX, backends, 0, expectedOutput);
66 }
67 } // TEST_SUITE ("Softmax_GpuAccTests")
68
69 TEST_SUITE ("Softmax_CpuAccTests")
70 {
71
72 TEST_CASE ("Softmax_Standard_Beta_CpuAcc_Test")
73 {
74 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
75 std::vector<float> expectedOutput = {0.00994190481, 0.0445565246, 0.0734612942, 0.329230666, 0.542809606,
76 0.710742831, 0.158588171, 0.0961885825, 0.0214625746, 0.0130177103};
77 SoftmaxTestCase(tflite::BuiltinOperator_SOFTMAX, backends, 1, expectedOutput);
78 }
79
80 TEST_CASE ("Softmax_Different_Beta_CpuAcc_Test")
81 {
82 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
83 std::vector<float> expectedOutput = {
84 0.0946234912, 0.148399189, 0.172415257, 0.270400971, 0.314161092,
85 0.352414012, 0.224709094, 0.193408906, 0.123322964, 0.106145054};
86 SoftmaxTestCase(tflite::BuiltinOperator_SOFTMAX, backends, 0.3, expectedOutput);
87 }
88
89 TEST_CASE ("Log_Softmax_CpuAcc_Test")
90 {
91 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
92 std::vector<float> expectedOutput =
93 {-4.61099672, -3.11099672, -2.61099672, -1.11099672, -0.610996664,
94 -0.341444582, -1.84144461, -2.34144449, -3.84144449, -4.34144449};
95 SoftmaxTestCase(tflite::BuiltinOperator_LOG_SOFTMAX, backends, 0, expectedOutput);
96 }
97 } // TEST_SUITE ("Softmax_CpuAccTests")
98
99 TEST_SUITE ("Softmax_CpuRefTests")
100 {
101
102 TEST_CASE ("Softmax_Standard_Beta_CpuRef_Test")
103 {
104 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
105 std::vector<float> expectedOutput = {
106 0.00994190481, 0.0445565246, 0.0734612942, 0.329230666, 0.542809606,
107 0.710742831, 0.158588171, 0.0961885825, 0.0214625746, 0.0130177103};
108 SoftmaxTestCase(tflite::BuiltinOperator_SOFTMAX, backends, 1, expectedOutput);
109 }
110
111 TEST_CASE ("Softmax_Different_Beta_CpuRef_Test")
112 {
113 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
114 std::vector<float> expectedOutput = {
115 0.0946234912, 0.148399189, 0.172415257, 0.270400971, 0.314161092,
116 0.352414012, 0.224709094, 0.193408906, 0.123322964, 0.106145054};
117 SoftmaxTestCase(tflite::BuiltinOperator_SOFTMAX, backends, 0.3, expectedOutput);
118 }
119
120 TEST_CASE ("Log_Softmax_CpuRef_Test")
121 {
122 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
123 std::vector<float> expectedOutput =
124 {-4.61099672, -3.11099672, -2.61099672, -1.11099672, -0.610996664,
125 -0.341444582, -1.84144461, -2.34144449, -3.84144449, -4.34144449};
126 SoftmaxTestCase(tflite::BuiltinOperator_LOG_SOFTMAX, backends, 0, expectedOutput);
127 }
128 } // TEST_SUITE ("Softmax_CpuRefTests")
129 } // namespace armnnDelegate
130