• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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