xref: /aosp_15_r20/external/armnn/delegate/test/Convolution2dTest.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020, 2023 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include "ConvolutionTestHelper.hpp"
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include <armnn_delegate.hpp>
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker #include <flatbuffers/flatbuffers.h>
11*89c4ff92SAndroid Build Coastguard Worker #include <tensorflow/lite/interpreter.h>
12*89c4ff92SAndroid Build Coastguard Worker #include <tensorflow/lite/kernels/register.h>
13*89c4ff92SAndroid Build Coastguard Worker #include <tensorflow/lite/model.h>
14*89c4ff92SAndroid Build Coastguard Worker #include <schema_generated.h>
15*89c4ff92SAndroid Build Coastguard Worker #include <tensorflow/lite/version.h>
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h>
18*89c4ff92SAndroid Build Coastguard Worker 
19*89c4ff92SAndroid Build Coastguard Worker namespace armnnDelegate
20*89c4ff92SAndroid Build Coastguard Worker {
21*89c4ff92SAndroid Build Coastguard Worker 
Conv2DWithBiasesFp32Test(std::vector<armnn::BackendId> & backends)22*89c4ff92SAndroid Build Coastguard Worker void Conv2DWithBiasesFp32Test(std::vector<armnn::BackendId>& backends)
23*89c4ff92SAndroid Build Coastguard Worker {
24*89c4ff92SAndroid Build Coastguard Worker     // Set input data
25*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> inputShape { 1, 5, 5, 1 };
26*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> filterShape { 1, 3, 3, 1 };
27*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> biasShape { 1 };
28*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputShape { 1, 3, 3, 1 };
29*89c4ff92SAndroid Build Coastguard Worker 
30*89c4ff92SAndroid Build Coastguard Worker     static std::vector<float> inputValues =
31*89c4ff92SAndroid Build Coastguard Worker         {
32*89c4ff92SAndroid Build Coastguard Worker             1, 5, 2, 3, 5,
33*89c4ff92SAndroid Build Coastguard Worker             8, 7, 3, 6, 3,
34*89c4ff92SAndroid Build Coastguard Worker             3, 3, 9, 1, 9,
35*89c4ff92SAndroid Build Coastguard Worker             4, 1, 8, 1, 3,
36*89c4ff92SAndroid Build Coastguard Worker             6, 8, 1, 9, 2
37*89c4ff92SAndroid Build Coastguard Worker         };
38*89c4ff92SAndroid Build Coastguard Worker 
39*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> filterValues =
40*89c4ff92SAndroid Build Coastguard Worker         {
41*89c4ff92SAndroid Build Coastguard Worker             4, 5, 6,
42*89c4ff92SAndroid Build Coastguard Worker             0, 0, 0,
43*89c4ff92SAndroid Build Coastguard Worker             3, 2, 1
44*89c4ff92SAndroid Build Coastguard Worker         };
45*89c4ff92SAndroid Build Coastguard Worker 
46*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> biasValues = { 0 };
47*89c4ff92SAndroid Build Coastguard Worker 
48*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> expectedOutputValues =
49*89c4ff92SAndroid Build Coastguard Worker         {
50*89c4ff92SAndroid Build Coastguard Worker             23, 33, 24,
51*89c4ff92SAndroid Build Coastguard Worker             91, 99, 48,
52*89c4ff92SAndroid Build Coastguard Worker             26, 50, 19
53*89c4ff92SAndroid Build Coastguard Worker         };
54*89c4ff92SAndroid Build Coastguard Worker 
55*89c4ff92SAndroid Build Coastguard Worker     tflite::Padding padding = tflite::Padding_SAME;
56*89c4ff92SAndroid Build Coastguard Worker 
57*89c4ff92SAndroid Build Coastguard Worker     ConvolutionTest<float>(tflite::BuiltinOperator_CONV_2D,
58*89c4ff92SAndroid Build Coastguard Worker                                  ::tflite::TensorType_FLOAT32,
59*89c4ff92SAndroid Build Coastguard Worker                                  2, // strideX
60*89c4ff92SAndroid Build Coastguard Worker                                  2, // strideY
61*89c4ff92SAndroid Build Coastguard Worker                                  1, // dilationX
62*89c4ff92SAndroid Build Coastguard Worker                                  1, // dilationY
63*89c4ff92SAndroid Build Coastguard Worker                                  padding,
64*89c4ff92SAndroid Build Coastguard Worker                                  tflite::ActivationFunctionType_NONE,
65*89c4ff92SAndroid Build Coastguard Worker                                  backends,
66*89c4ff92SAndroid Build Coastguard Worker                                  inputShape,
67*89c4ff92SAndroid Build Coastguard Worker                                  filterShape,
68*89c4ff92SAndroid Build Coastguard Worker                                  outputShape,
69*89c4ff92SAndroid Build Coastguard Worker                                  inputValues,
70*89c4ff92SAndroid Build Coastguard Worker                                  filterValues,
71*89c4ff92SAndroid Build Coastguard Worker                                  expectedOutputValues,
72*89c4ff92SAndroid Build Coastguard Worker                                  biasShape,
73*89c4ff92SAndroid Build Coastguard Worker                                  biasValues);
74*89c4ff92SAndroid Build Coastguard Worker }
75*89c4ff92SAndroid Build Coastguard Worker 
Conv2DWithBiasesInt8Test(std::vector<armnn::BackendId> & backends)76*89c4ff92SAndroid Build Coastguard Worker void Conv2DWithBiasesInt8Test(std::vector<armnn::BackendId>& backends)
77*89c4ff92SAndroid Build Coastguard Worker {
78*89c4ff92SAndroid Build Coastguard Worker     // Set input data
79*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> inputShape { 1, 2, 2, 1 };
80*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> filterShape { 1, 2, 2, 1 };
81*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> biasShape { 1 };
82*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputShape { 1, 2, 2, 1 };
83*89c4ff92SAndroid Build Coastguard Worker 
84*89c4ff92SAndroid Build Coastguard Worker     static std::vector<int8_t> inputValues = { 1, 2, 3, 4 };
85*89c4ff92SAndroid Build Coastguard Worker 
86*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> filterValues = { 2, 1, 0, 6 };
87*89c4ff92SAndroid Build Coastguard Worker 
88*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> biasValues = { 10 };
89*89c4ff92SAndroid Build Coastguard Worker 
90*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> expectedOutputValues =
91*89c4ff92SAndroid Build Coastguard Worker         {
92*89c4ff92SAndroid Build Coastguard Worker             (1 * 2 + 2 * 1 + 3 * 0 + 4 * 6 + 10) / 2, // 19
93*89c4ff92SAndroid Build Coastguard Worker             (2 * 2 + 0 * 1 + 4 * 0 + 0 * 6 + 10) / 2, // 7
94*89c4ff92SAndroid Build Coastguard Worker             (3 * 2 + 4 * 1 + 0 * 0 + 0 * 6 + 10) / 2, // 10
95*89c4ff92SAndroid Build Coastguard Worker             (4 * 2 + 0 * 1 + 0 * 0 + 0 * 6 + 10) / 2,  // 9
96*89c4ff92SAndroid Build Coastguard Worker         };
97*89c4ff92SAndroid Build Coastguard Worker 
98*89c4ff92SAndroid Build Coastguard Worker     tflite::Padding padding = tflite::Padding_SAME;
99*89c4ff92SAndroid Build Coastguard Worker 
100*89c4ff92SAndroid Build Coastguard Worker     ConvolutionTest<int8_t, int32_t>(tflite::BuiltinOperator_CONV_2D,
101*89c4ff92SAndroid Build Coastguard Worker                                             ::tflite::TensorType_INT8,
102*89c4ff92SAndroid Build Coastguard Worker                                             1, // strideX
103*89c4ff92SAndroid Build Coastguard Worker                                             1, // strideY
104*89c4ff92SAndroid Build Coastguard Worker                                             1, // dilationX
105*89c4ff92SAndroid Build Coastguard Worker                                             1, // dilationY
106*89c4ff92SAndroid Build Coastguard Worker                                             padding,
107*89c4ff92SAndroid Build Coastguard Worker                                             tflite::ActivationFunctionType_NONE,
108*89c4ff92SAndroid Build Coastguard Worker                                             backends,
109*89c4ff92SAndroid Build Coastguard Worker                                             inputShape,
110*89c4ff92SAndroid Build Coastguard Worker                                             filterShape,
111*89c4ff92SAndroid Build Coastguard Worker                                             outputShape,
112*89c4ff92SAndroid Build Coastguard Worker                                             inputValues,
113*89c4ff92SAndroid Build Coastguard Worker                                             filterValues,
114*89c4ff92SAndroid Build Coastguard Worker                                             expectedOutputValues,
115*89c4ff92SAndroid Build Coastguard Worker                                             biasShape,
116*89c4ff92SAndroid Build Coastguard Worker                                             biasValues);
117*89c4ff92SAndroid Build Coastguard Worker }
118*89c4ff92SAndroid Build Coastguard Worker 
Conv2DWithBiasesReluUint8Test(std::vector<armnn::BackendId> & backends)119*89c4ff92SAndroid Build Coastguard Worker void Conv2DWithBiasesReluUint8Test(std::vector<armnn::BackendId>& backends)
120*89c4ff92SAndroid Build Coastguard Worker {
121*89c4ff92SAndroid Build Coastguard Worker     // Set input data
122*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> inputShape { 1, 2, 2, 1 };
123*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> filterShape { 1, 2, 2, 1 };
124*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> biasShape { 1 };
125*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputShape { 1, 2, 2, 1 };
126*89c4ff92SAndroid Build Coastguard Worker 
127*89c4ff92SAndroid Build Coastguard Worker     static std::vector<uint8_t> inputValues = { 1, 2, 4, 8 };
128*89c4ff92SAndroid Build Coastguard Worker 
129*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> filterValues = { 2, 1, 0, 6 };
130*89c4ff92SAndroid Build Coastguard Worker 
131*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> biasValues = { 16 };
132*89c4ff92SAndroid Build Coastguard Worker 
133*89c4ff92SAndroid Build Coastguard Worker     // factors to consider:
134*89c4ff92SAndroid Build Coastguard Worker     // - the filter zero point is non zero, hence the (x-fz)
135*89c4ff92SAndroid Build Coastguard Worker     // - the output scale is 2 hence the /2
136*89c4ff92SAndroid Build Coastguard Worker     // - output zero point is non zero, hence the +outZero
137*89c4ff92SAndroid Build Coastguard Worker     // - RELU cuts negative values and then we add the output zero point
138*89c4ff92SAndroid Build Coastguard Worker     uint8_t bias = 16;
139*89c4ff92SAndroid Build Coastguard Worker     uint8_t outZero = 20;
140*89c4ff92SAndroid Build Coastguard Worker     uint8_t fz = 4; // filter zero point
141*89c4ff92SAndroid Build Coastguard Worker 
142*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> expectedOutputValues =
143*89c4ff92SAndroid Build Coastguard Worker         {
144*89c4ff92SAndroid Build Coastguard Worker             std::max(outZero, static_cast<uint8_t>((1*(2-fz) + 2*(1-fz) + 4*(0-fz) + 8*(6-fz) + bias)/2 + outZero)),
145*89c4ff92SAndroid Build Coastguard Worker             std::max(outZero, static_cast<uint8_t>((2*(2-fz) + 0*(1-fz) + 8*(0-fz) + 0*(6-fz) + bias)/2 + outZero)),
146*89c4ff92SAndroid Build Coastguard Worker             std::max(outZero, static_cast<uint8_t>((4*(2-fz) + 8*(1-fz) + 0*(0-fz) + 0*(6-fz) + bias)/2 + outZero)),
147*89c4ff92SAndroid Build Coastguard Worker             std::max(outZero, static_cast<uint8_t>((8*(2-fz) + 0*(1-fz) + 0*(0-fz) + 0*(6-fz) + bias)/2 + outZero))
148*89c4ff92SAndroid Build Coastguard Worker         };
149*89c4ff92SAndroid Build Coastguard Worker 
150*89c4ff92SAndroid Build Coastguard Worker     tflite::Padding padding = tflite::Padding_SAME;
151*89c4ff92SAndroid Build Coastguard Worker 
152*89c4ff92SAndroid Build Coastguard Worker     ConvolutionTest<uint8_t, int32_t>(tflite::BuiltinOperator_CONV_2D,
153*89c4ff92SAndroid Build Coastguard Worker                                             ::tflite::TensorType_UINT8,
154*89c4ff92SAndroid Build Coastguard Worker                                             1, // strideX
155*89c4ff92SAndroid Build Coastguard Worker                                             1, // strideY
156*89c4ff92SAndroid Build Coastguard Worker                                             1, // dilationX
157*89c4ff92SAndroid Build Coastguard Worker                                             1, // dilationY
158*89c4ff92SAndroid Build Coastguard Worker                                             padding,
159*89c4ff92SAndroid Build Coastguard Worker                                             tflite::ActivationFunctionType_RELU,
160*89c4ff92SAndroid Build Coastguard Worker                                             backends,
161*89c4ff92SAndroid Build Coastguard Worker                                             inputShape,
162*89c4ff92SAndroid Build Coastguard Worker                                             filterShape,
163*89c4ff92SAndroid Build Coastguard Worker                                             outputShape,
164*89c4ff92SAndroid Build Coastguard Worker                                             inputValues,
165*89c4ff92SAndroid Build Coastguard Worker                                             filterValues,
166*89c4ff92SAndroid Build Coastguard Worker                                             expectedOutputValues,
167*89c4ff92SAndroid Build Coastguard Worker                                             biasShape,
168*89c4ff92SAndroid Build Coastguard Worker                                             biasValues,
169*89c4ff92SAndroid Build Coastguard Worker                                             {1.0f}, // biasScale
170*89c4ff92SAndroid Build Coastguard Worker                                             {0},    // biasOffset
171*89c4ff92SAndroid Build Coastguard Worker                                             {1.0f}, // filterScale
172*89c4ff92SAndroid Build Coastguard Worker                                             {4},    // filterOffsets
173*89c4ff92SAndroid Build Coastguard Worker                                             2, // output scale
174*89c4ff92SAndroid Build Coastguard Worker                                             20); // output offset
175*89c4ff92SAndroid Build Coastguard Worker }
176*89c4ff92SAndroid Build Coastguard Worker 
Conv2DWithBiasesRelu6Uint8Test(std::vector<armnn::BackendId> & backends)177*89c4ff92SAndroid Build Coastguard Worker void Conv2DWithBiasesRelu6Uint8Test(std::vector<armnn::BackendId>& backends)
178*89c4ff92SAndroid Build Coastguard Worker {
179*89c4ff92SAndroid Build Coastguard Worker     // Set input data
180*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> inputShape { 1, 2, 2, 1 };
181*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> filterShape { 1, 2, 2, 1 };
182*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> biasShape { 1 };
183*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputShape { 1, 2, 2, 1 };
184*89c4ff92SAndroid Build Coastguard Worker 
185*89c4ff92SAndroid Build Coastguard Worker     static std::vector<uint8_t> inputValues = { 1, 2, 4, 1 };
186*89c4ff92SAndroid Build Coastguard Worker 
187*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> filterValues = { 2, 1, 0, 6 };
188*89c4ff92SAndroid Build Coastguard Worker 
189*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> biasValues = { 0 };
190*89c4ff92SAndroid Build Coastguard Worker 
191*89c4ff92SAndroid Build Coastguard Worker     // factors to consider:
192*89c4ff92SAndroid Build Coastguard Worker     // - the output scale is 2 hence the /2
193*89c4ff92SAndroid Build Coastguard Worker     // - RELU6 cuts output values at +6
194*89c4ff92SAndroid Build Coastguard Worker     uint8_t relu6Min = 6 / 2; // divide by output scale
195*89c4ff92SAndroid Build Coastguard Worker 
196*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> expectedOutputValues =
197*89c4ff92SAndroid Build Coastguard Worker         {
198*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((1 * 2 + 2 * 1 + 4 * 0 + 1 * 6) / 2)),
199*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((2 * 2 + 0 * 1 + 1 * 0 + 0 * 6) / 2)),
200*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((4 * 2 + 1 * 1 + 0 * 0 + 0 * 6) / 2)),
201*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((1 * 2 + 0 * 1 + 0 * 0 + 0 * 6) / 2))
202*89c4ff92SAndroid Build Coastguard Worker         };
203*89c4ff92SAndroid Build Coastguard Worker 
204*89c4ff92SAndroid Build Coastguard Worker     tflite::Padding padding = tflite::Padding_SAME;
205*89c4ff92SAndroid Build Coastguard Worker 
206*89c4ff92SAndroid Build Coastguard Worker     ConvolutionTest<uint8_t, int32_t>(tflite::BuiltinOperator_CONV_2D,
207*89c4ff92SAndroid Build Coastguard Worker                                             ::tflite::TensorType_UINT8,
208*89c4ff92SAndroid Build Coastguard Worker                                             1, // strideX
209*89c4ff92SAndroid Build Coastguard Worker                                             1, // strideY
210*89c4ff92SAndroid Build Coastguard Worker                                             1, // dilationX
211*89c4ff92SAndroid Build Coastguard Worker                                             1, // dilationY
212*89c4ff92SAndroid Build Coastguard Worker                                             padding,
213*89c4ff92SAndroid Build Coastguard Worker                                             tflite::ActivationFunctionType_RELU6,
214*89c4ff92SAndroid Build Coastguard Worker                                             backends,
215*89c4ff92SAndroid Build Coastguard Worker                                             inputShape,
216*89c4ff92SAndroid Build Coastguard Worker                                             filterShape,
217*89c4ff92SAndroid Build Coastguard Worker                                             outputShape,
218*89c4ff92SAndroid Build Coastguard Worker                                             inputValues,
219*89c4ff92SAndroid Build Coastguard Worker                                             filterValues,
220*89c4ff92SAndroid Build Coastguard Worker                                             expectedOutputValues,
221*89c4ff92SAndroid Build Coastguard Worker                                             biasShape,
222*89c4ff92SAndroid Build Coastguard Worker                                             biasValues);
223*89c4ff92SAndroid Build Coastguard Worker }
224*89c4ff92SAndroid Build Coastguard Worker 
225*89c4ff92SAndroid Build Coastguard Worker 
Conv2DPerChannelInt8Test(std::vector<armnn::BackendId> & backends)226*89c4ff92SAndroid Build Coastguard Worker void Conv2DPerChannelInt8Test(std::vector<armnn::BackendId>& backends)
227*89c4ff92SAndroid Build Coastguard Worker {
228*89c4ff92SAndroid Build Coastguard Worker     // Set input data
229*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> inputShape  { 1,4,4,2 };
230*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> filterShape { 4,2,2,2 };
231*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> biasShape   { 4 };
232*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputShape { 1,4,4,4 };
233*89c4ff92SAndroid Build Coastguard Worker 
234*89c4ff92SAndroid Build Coastguard Worker     static std::vector<int8_t> inputValues =
235*89c4ff92SAndroid Build Coastguard Worker         {
236*89c4ff92SAndroid Build Coastguard Worker             -11, 40,-26, 11,-28,  8,  0, -8,
237*89c4ff92SAndroid Build Coastguard Worker             -10, 34, 47,  0,-33,-14, 28, 35,
238*89c4ff92SAndroid Build Coastguard Worker               6,-28,-26,  8, 13, 33,-31,-41,
239*89c4ff92SAndroid Build Coastguard Worker              31,-20,-31,-16,  8,-18,-44,  0
240*89c4ff92SAndroid Build Coastguard Worker         };
241*89c4ff92SAndroid Build Coastguard Worker 
242*89c4ff92SAndroid Build Coastguard Worker     std::vector<float>  filterScales = { 1.858268, 2.0, 1.992126, 1.905512 };
243*89c4ff92SAndroid Build Coastguard Worker     int32_t filterQuantizationDim    = 0;
244*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> filterValues =
245*89c4ff92SAndroid Build Coastguard Worker         {
246*89c4ff92SAndroid Build Coastguard Worker              13,-44,  5,-14, 21,-45, 36,-25,
247*89c4ff92SAndroid Build Coastguard Worker             -42, -2, 24,-30,-31, 35, 43,-30,
248*89c4ff92SAndroid Build Coastguard Worker             -20, -5, 25, 17, 18, 20,  4,-46,
249*89c4ff92SAndroid Build Coastguard Worker             -49,  9, -3,-20, 46,  5,  7,-15
250*89c4ff92SAndroid Build Coastguard Worker         };
251*89c4ff92SAndroid Build Coastguard Worker 
252*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> biasValues = { 0,0,0,0 };
253*89c4ff92SAndroid Build Coastguard Worker     std::vector<float>   biasScales = { 0.721445, 0.7764700055, 0.773414, 0.739787 };
254*89c4ff92SAndroid Build Coastguard Worker 
255*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> expectedOutputValues =
256*89c4ff92SAndroid Build Coastguard Worker         {
257*89c4ff92SAndroid Build Coastguard Worker                -1,  9,  3, 5, 1, -1,  5,  9,
258*89c4ff92SAndroid Build Coastguard Worker                 2,  7, -1, 2, 2,  4,  5,  6,
259*89c4ff92SAndroid Build Coastguard Worker                 1,  1,  4, 4, 2,  0, -4, -3,
260*89c4ff92SAndroid Build Coastguard Worker                 0,  6, 12, 6, 3,  0, -1, -2,
261*89c4ff92SAndroid Build Coastguard Worker                 7, -4,  4, 4, 3,  6,  6,  2,
262*89c4ff92SAndroid Build Coastguard Worker                 0, -3, -1, 4, 4,  8,  3,  1,
263*89c4ff92SAndroid Build Coastguard Worker                 5,  0,  0, 1, 4,  7,  4,  6,
264*89c4ff92SAndroid Build Coastguard Worker                 4,  0,  1, 2, 2,  7,  5,  7
265*89c4ff92SAndroid Build Coastguard Worker         };
266*89c4ff92SAndroid Build Coastguard Worker     float outputQuantScale  = 401.960785f;
267*89c4ff92SAndroid Build Coastguard Worker     int   outputQuantOffset = 3;
268*89c4ff92SAndroid Build Coastguard Worker     float inputQuantScale   = 0.388235f;
269*89c4ff92SAndroid Build Coastguard Worker     int   inputQuantOffset  = 1;
270*89c4ff92SAndroid Build Coastguard Worker 
271*89c4ff92SAndroid Build Coastguard Worker     tflite::Padding padding = tflite::Padding_SAME;
272*89c4ff92SAndroid Build Coastguard Worker 
273*89c4ff92SAndroid Build Coastguard Worker     ConvolutionTest<int8_t, int32_t>(tflite::BuiltinOperator_CONV_2D,
274*89c4ff92SAndroid Build Coastguard Worker                                             ::tflite::TensorType_INT8,
275*89c4ff92SAndroid Build Coastguard Worker                                             1, // strideX
276*89c4ff92SAndroid Build Coastguard Worker                                             1, // strideY
277*89c4ff92SAndroid Build Coastguard Worker                                             1, // dilationX
278*89c4ff92SAndroid Build Coastguard Worker                                             1, // dilationY
279*89c4ff92SAndroid Build Coastguard Worker                                             padding,
280*89c4ff92SAndroid Build Coastguard Worker                                             tflite::ActivationFunctionType_NONE,
281*89c4ff92SAndroid Build Coastguard Worker                                             backends,
282*89c4ff92SAndroid Build Coastguard Worker                                             inputShape,
283*89c4ff92SAndroid Build Coastguard Worker                                             filterShape,
284*89c4ff92SAndroid Build Coastguard Worker                                             outputShape,
285*89c4ff92SAndroid Build Coastguard Worker                                             inputValues,
286*89c4ff92SAndroid Build Coastguard Worker                                             filterValues,
287*89c4ff92SAndroid Build Coastguard Worker                                             expectedOutputValues,
288*89c4ff92SAndroid Build Coastguard Worker                                             biasShape,
289*89c4ff92SAndroid Build Coastguard Worker                                             biasValues,
290*89c4ff92SAndroid Build Coastguard Worker                                             biasScales,
291*89c4ff92SAndroid Build Coastguard Worker                                             {0,0,0,0},
292*89c4ff92SAndroid Build Coastguard Worker                                             filterScales,
293*89c4ff92SAndroid Build Coastguard Worker                                             {0,0,0,0},
294*89c4ff92SAndroid Build Coastguard Worker                                             outputQuantScale,
295*89c4ff92SAndroid Build Coastguard Worker                                             outputQuantOffset,
296*89c4ff92SAndroid Build Coastguard Worker                                             inputQuantScale,
297*89c4ff92SAndroid Build Coastguard Worker                                             inputQuantOffset,
298*89c4ff92SAndroid Build Coastguard Worker                                             1, // depth_multiplier is ignored for conv2d value doesn't matter
299*89c4ff92SAndroid Build Coastguard Worker                                             filterQuantizationDim);
300*89c4ff92SAndroid Build Coastguard Worker }
301*89c4ff92SAndroid Build Coastguard Worker 
302*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("Convolution2dTest_CpuRefTests")
303*89c4ff92SAndroid Build Coastguard Worker {
304*89c4ff92SAndroid Build Coastguard Worker 
305*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("Conv2DWithBiases_Fp32_CpuRef_Test")
306*89c4ff92SAndroid Build Coastguard Worker {
307*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::CpuRef};
308*89c4ff92SAndroid Build Coastguard Worker     Conv2DWithBiasesFp32Test(backends);
309*89c4ff92SAndroid Build Coastguard Worker }
310*89c4ff92SAndroid Build Coastguard Worker 
311*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("Conv2DWithBiases_Int8_CpuRef_Test")
312*89c4ff92SAndroid Build Coastguard Worker {
313*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::CpuRef};
314*89c4ff92SAndroid Build Coastguard Worker     Conv2DWithBiasesInt8Test(backends);
315*89c4ff92SAndroid Build Coastguard Worker }
316*89c4ff92SAndroid Build Coastguard Worker 
317*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("Conv2DPerChannel_Int8_CpuRef_Test")
318*89c4ff92SAndroid Build Coastguard Worker {
319*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::CpuRef};
320*89c4ff92SAndroid Build Coastguard Worker     Conv2DPerChannelInt8Test(backends);
321*89c4ff92SAndroid Build Coastguard Worker }
322*89c4ff92SAndroid Build Coastguard Worker 
323*89c4ff92SAndroid Build Coastguard Worker } //End of TEST_SUITE("Convolution2dTest_CpuRef")
324*89c4ff92SAndroid Build Coastguard Worker 
325*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("Convolution2dTest_CpuAccTests")
326*89c4ff92SAndroid Build Coastguard Worker {
327*89c4ff92SAndroid Build Coastguard Worker 
328*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("Conv2DWithBiases_Fp32_CpuAcc_Test")
329*89c4ff92SAndroid Build Coastguard Worker {
330*89c4ff92SAndroid Build Coastguard Worker std::vector <armnn::BackendId> backends = {armnn::Compute::CpuAcc};
331*89c4ff92SAndroid Build Coastguard Worker Conv2DWithBiasesFp32Test(backends);
332*89c4ff92SAndroid Build Coastguard Worker }
333*89c4ff92SAndroid Build Coastguard Worker 
334*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("Conv2DWithBiases_Int8_CpuAcc_Test")
335*89c4ff92SAndroid Build Coastguard Worker {
336*89c4ff92SAndroid Build Coastguard Worker std::vector <armnn::BackendId> backends = {armnn::Compute::CpuAcc};
337*89c4ff92SAndroid Build Coastguard Worker Conv2DWithBiasesInt8Test(backends);
338*89c4ff92SAndroid Build Coastguard Worker }
339*89c4ff92SAndroid Build Coastguard Worker 
340*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("Conv2DPerChannel_Int8_CpuAcc_Test")
341*89c4ff92SAndroid Build Coastguard Worker {
342*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::CpuAcc};
343*89c4ff92SAndroid Build Coastguard Worker     Conv2DPerChannelInt8Test(backends);
344*89c4ff92SAndroid Build Coastguard Worker }
345*89c4ff92SAndroid Build Coastguard Worker 
346*89c4ff92SAndroid Build Coastguard Worker } //End of TEST_SUITE("Convolution2dTest_CpuAcc")
347*89c4ff92SAndroid Build Coastguard Worker 
348*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("Convolution2dTest_GpuAccTests")
349*89c4ff92SAndroid Build Coastguard Worker {
350*89c4ff92SAndroid Build Coastguard Worker 
351*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("Conv2DWithBiases_Fp32_GpuAcc_Test")
352*89c4ff92SAndroid Build Coastguard Worker {
353*89c4ff92SAndroid Build Coastguard Worker std::vector <armnn::BackendId> backends = {armnn::Compute::GpuAcc};
354*89c4ff92SAndroid Build Coastguard Worker Conv2DWithBiasesFp32Test(backends);
355*89c4ff92SAndroid Build Coastguard Worker }
356*89c4ff92SAndroid Build Coastguard Worker 
357*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("Conv2DWithBiases_Int8_GpuAcc_Test")
358*89c4ff92SAndroid Build Coastguard Worker {
359*89c4ff92SAndroid Build Coastguard Worker std::vector <armnn::BackendId> backends = {armnn::Compute::GpuAcc};
360*89c4ff92SAndroid Build Coastguard Worker Conv2DWithBiasesInt8Test(backends);
361*89c4ff92SAndroid Build Coastguard Worker }
362*89c4ff92SAndroid Build Coastguard Worker 
363*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("Conv2DPerChannel_Int8_GpuAcc_Test")
364*89c4ff92SAndroid Build Coastguard Worker {
365*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::GpuAcc};
366*89c4ff92SAndroid Build Coastguard Worker     Conv2DPerChannelInt8Test(backends);
367*89c4ff92SAndroid Build Coastguard Worker }
368*89c4ff92SAndroid Build Coastguard Worker 
369*89c4ff92SAndroid Build Coastguard Worker } //End of TEST_SUITE("Convolution2dTest_GpuAcc")
370*89c4ff92SAndroid Build Coastguard Worker 
TransposeConvInt8Test(std::vector<armnn::BackendId> & backends)371*89c4ff92SAndroid Build Coastguard Worker void TransposeConvInt8Test(std::vector<armnn::BackendId>& backends)
372*89c4ff92SAndroid Build Coastguard Worker {
373*89c4ff92SAndroid Build Coastguard Worker     // Set input data
374*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> transposeTensorShape { 4 };
375*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> filterShape { 1, 2, 2, 1 };
376*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> inputShape { 1, 2, 2, 1 };
377*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputShape { 1, 3, 3, 1 };
378*89c4ff92SAndroid Build Coastguard Worker 
379*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> transposeData = { 1, 3, 3, 1 };
380*89c4ff92SAndroid Build Coastguard Worker     static std::vector<int8_t> inputValues = { 1, 2, 3, 4 };
381*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> filterValues = { 0, 1, 2, 4 };
382*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> expectedOutputValues =
383*89c4ff92SAndroid Build Coastguard Worker         {
384*89c4ff92SAndroid Build Coastguard Worker             0, 1,  2,
385*89c4ff92SAndroid Build Coastguard Worker             2, 11, 12,
386*89c4ff92SAndroid Build Coastguard Worker             6, 20, 16
387*89c4ff92SAndroid Build Coastguard Worker         };
388*89c4ff92SAndroid Build Coastguard Worker 
389*89c4ff92SAndroid Build Coastguard Worker     tflite::Padding padding = tflite::Padding_VALID;
390*89c4ff92SAndroid Build Coastguard Worker     TransposeConvTest<int8_t>(backends,
391*89c4ff92SAndroid Build Coastguard Worker                              ::tflite::TensorType_INT8,
392*89c4ff92SAndroid Build Coastguard Worker                              1, // strideX
393*89c4ff92SAndroid Build Coastguard Worker                              1, // strideY
394*89c4ff92SAndroid Build Coastguard Worker                              padding,
395*89c4ff92SAndroid Build Coastguard Worker                              transposeTensorShape,
396*89c4ff92SAndroid Build Coastguard Worker                              filterShape,
397*89c4ff92SAndroid Build Coastguard Worker                              inputShape,
398*89c4ff92SAndroid Build Coastguard Worker                              outputShape,
399*89c4ff92SAndroid Build Coastguard Worker                              transposeData,
400*89c4ff92SAndroid Build Coastguard Worker                              filterValues,
401*89c4ff92SAndroid Build Coastguard Worker                              inputValues,
402*89c4ff92SAndroid Build Coastguard Worker                              expectedOutputValues);
403*89c4ff92SAndroid Build Coastguard Worker }
404*89c4ff92SAndroid Build Coastguard Worker 
TransposeConvFp32Test(std::vector<armnn::BackendId> & backends)405*89c4ff92SAndroid Build Coastguard Worker void TransposeConvFp32Test(std::vector<armnn::BackendId>& backends)
406*89c4ff92SAndroid Build Coastguard Worker {
407*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> transposeTensorShape { 4 };
408*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> filterShape { 1, 2, 2, 1 };
409*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> inputShape { 1, 2, 2, 1 };
410*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputShape { 1, 3, 3, 1 };
411*89c4ff92SAndroid Build Coastguard Worker 
412*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> transposeData = { 1, 3, 3, 1 };
413*89c4ff92SAndroid Build Coastguard Worker     static std::vector<float> inputValues = { 1, 2, 3, 4 };
414*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> filterValues = { 0, 1, 2, 4 };
415*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> expectedOutputValues =
416*89c4ff92SAndroid Build Coastguard Worker         {
417*89c4ff92SAndroid Build Coastguard Worker             0, 1,  2,
418*89c4ff92SAndroid Build Coastguard Worker             2, 11, 12,
419*89c4ff92SAndroid Build Coastguard Worker             6, 20, 16
420*89c4ff92SAndroid Build Coastguard Worker         };
421*89c4ff92SAndroid Build Coastguard Worker 
422*89c4ff92SAndroid Build Coastguard Worker     tflite::Padding padding = tflite::Padding_VALID;
423*89c4ff92SAndroid Build Coastguard Worker     TransposeConvTest<float>(backends,
424*89c4ff92SAndroid Build Coastguard Worker                              ::tflite::TensorType_FLOAT32,
425*89c4ff92SAndroid Build Coastguard Worker                              1, // strideX
426*89c4ff92SAndroid Build Coastguard Worker                              1, // strideY
427*89c4ff92SAndroid Build Coastguard Worker                              padding,
428*89c4ff92SAndroid Build Coastguard Worker                              transposeTensorShape,
429*89c4ff92SAndroid Build Coastguard Worker                              filterShape,
430*89c4ff92SAndroid Build Coastguard Worker                              inputShape,
431*89c4ff92SAndroid Build Coastguard Worker                              outputShape,
432*89c4ff92SAndroid Build Coastguard Worker                              transposeData,
433*89c4ff92SAndroid Build Coastguard Worker                              filterValues,
434*89c4ff92SAndroid Build Coastguard Worker                              inputValues,
435*89c4ff92SAndroid Build Coastguard Worker                              expectedOutputValues);
436*89c4ff92SAndroid Build Coastguard Worker }
437*89c4ff92SAndroid Build Coastguard Worker 
438*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("TransposeConv_CpuRef_Test")
439*89c4ff92SAndroid Build Coastguard Worker {
440*89c4ff92SAndroid Build Coastguard Worker 
441*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("TransposeConv_CpuRef_Fp32_Test")
442*89c4ff92SAndroid Build Coastguard Worker {
443*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::CpuRef};
444*89c4ff92SAndroid Build Coastguard Worker     TransposeConvFp32Test(backends);
445*89c4ff92SAndroid Build Coastguard Worker }
446*89c4ff92SAndroid Build Coastguard Worker 
447*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("TransposeConv_CpuRef_Int8_Test")
448*89c4ff92SAndroid Build Coastguard Worker {
449*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::CpuRef};
450*89c4ff92SAndroid Build Coastguard Worker     TransposeConvInt8Test(backends);
451*89c4ff92SAndroid Build Coastguard Worker }
452*89c4ff92SAndroid Build Coastguard Worker 
453*89c4ff92SAndroid Build Coastguard Worker } // End of  TEST_SUITE(TransposeConv_CpuRef_Test)
454*89c4ff92SAndroid Build Coastguard Worker 
455*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("TransposeConv_CpuAcc_Test")
456*89c4ff92SAndroid Build Coastguard Worker {
457*89c4ff92SAndroid Build Coastguard Worker 
458*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("TransposeConv_CpuAcc_Fp32_Test")
459*89c4ff92SAndroid Build Coastguard Worker {
460*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::CpuAcc};
461*89c4ff92SAndroid Build Coastguard Worker     TransposeConvFp32Test(backends);
462*89c4ff92SAndroid Build Coastguard Worker }
463*89c4ff92SAndroid Build Coastguard Worker 
464*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("TransposeConv_CpuAcc_Int8_Test")
465*89c4ff92SAndroid Build Coastguard Worker {
466*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::CpuAcc};
467*89c4ff92SAndroid Build Coastguard Worker     TransposeConvInt8Test(backends);
468*89c4ff92SAndroid Build Coastguard Worker }
469*89c4ff92SAndroid Build Coastguard Worker 
470*89c4ff92SAndroid Build Coastguard Worker } // End of  TEST_SUITE(TransposeConv_CpuAcc_Test)
471*89c4ff92SAndroid Build Coastguard Worker 
472*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("TransposeConv_GpuAcc_Test")
473*89c4ff92SAndroid Build Coastguard Worker {
474*89c4ff92SAndroid Build Coastguard Worker 
475*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("TransposeConv_GpuAcc_Fp32_Test")
476*89c4ff92SAndroid Build Coastguard Worker {
477*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::GpuAcc};
478*89c4ff92SAndroid Build Coastguard Worker     TransposeConvFp32Test(backends);
479*89c4ff92SAndroid Build Coastguard Worker }
480*89c4ff92SAndroid Build Coastguard Worker 
481*89c4ff92SAndroid Build Coastguard Worker TEST_CASE ("TransposeConv_GpuAcc_Int8_Test")
482*89c4ff92SAndroid Build Coastguard Worker {
483*89c4ff92SAndroid Build Coastguard Worker     std::vector <armnn::BackendId> backends = {armnn::Compute::GpuAcc};
484*89c4ff92SAndroid Build Coastguard Worker     TransposeConvInt8Test(backends);
485*89c4ff92SAndroid Build Coastguard Worker }
486*89c4ff92SAndroid Build Coastguard Worker 
487*89c4ff92SAndroid Build Coastguard Worker } // End of  TEST_SUITE(TransposeConv_GpuAcc_Test)
488*89c4ff92SAndroid Build Coastguard Worker 
489*89c4ff92SAndroid Build Coastguard Worker } // namespace armnnDelegate