• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright 2019 The TensorFlow Authors. All Rights Reserved.
2 
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
6 
7     http://www.apache.org/licenses/LICENSE-2.0
8 
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14 ==============================================================================*/
15 
16 #include <cstdint>
17 
18 #include "tensorflow/lite/c/builtin_op_data.h"
19 #include "tensorflow/lite/c/common.h"
20 #include "tensorflow/lite/micro/kernels/kernel_runner.h"
21 #include "tensorflow/lite/micro/test_helpers.h"
22 #include "tensorflow/lite/micro/testing/micro_test.h"
23 
24 namespace tflite {
25 namespace testing {
26 namespace {
27 
28 template <typename T>
ValidatePoolingGoldens(TfLiteTensor * tensors,int tensors_size,const TfLiteRegistration registration,const int filter_height,const int filter_width,const int stride_height,const int stride_width,const T * golden,const int output_length,TfLitePadding padding,TfLiteFusedActivation activation,T * output_data)29 void ValidatePoolingGoldens(TfLiteTensor* tensors, int tensors_size,
30                             const TfLiteRegistration registration,
31                             const int filter_height, const int filter_width,
32                             const int stride_height, const int stride_width,
33                             const T* golden, const int output_length,
34                             TfLitePadding padding,
35                             TfLiteFusedActivation activation, T* output_data) {
36   int inputs_array_data[] = {1, 0};
37   TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data);
38   int outputs_array_data[] = {1, 1};
39   TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data);
40 
41   TfLitePoolParams builtin_data = {padding,
42                                    stride_width,
43                                    stride_height,
44                                    filter_width,
45                                    filter_height,
46                                    activation,
47                                    {}};
48 
49   micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array,
50                              outputs_array,
51                              reinterpret_cast<void*>(&builtin_data));
52 
53   TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare());
54   TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke());
55 
56   for (int i = 0; i < output_length; ++i) {
57     TF_LITE_MICRO_EXPECT_NEAR(golden[i], output_data[i], 1e-5f);
58   }
59 }
60 
TestAveragePoolFloat(const int * input_dims_data,const float * input_data,const int filter_height,const int filter_width,const int stride_height,const int stride_width,const float * expected_output_data,const int * output_dims_data,TfLitePadding padding,TfLiteFusedActivation activation,float * output_data)61 void TestAveragePoolFloat(const int* input_dims_data, const float* input_data,
62                           const int filter_height, const int filter_width,
63                           const int stride_height, const int stride_width,
64                           const float* expected_output_data,
65                           const int* output_dims_data, TfLitePadding padding,
66                           TfLiteFusedActivation activation,
67                           float* output_data) {
68   TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
69   TfLiteIntArray* output_dims = IntArrayFromInts(output_dims_data);
70   const int output_dims_count = ElementCount(*output_dims);
71 
72   constexpr int inputs_size = 1;
73   constexpr int outputs_size = 1;
74   constexpr int tensors_size = inputs_size + outputs_size;
75   TfLiteTensor tensors[tensors_size] = {
76       CreateTensor(input_data, input_dims),
77       CreateTensor(output_data, output_dims),
78   };
79 
80   const TfLiteRegistration registration =
81       tflite::ops::micro::Register_AVERAGE_POOL_2D();
82 
83   ValidatePoolingGoldens(tensors, tensors_size, registration, filter_height,
84                          filter_width, stride_height, stride_width,
85                          expected_output_data, output_dims_count, padding,
86                          activation, output_data);
87 }
88 
89 template <typename T>
TestAveragePoolQuantized(const int * input_dims_data,const T * input_data,const float input_scale,const int input_zero_point,const int filter_height,const int filter_width,const int stride_height,const int stride_width,const T * expected_output_data,const int * output_dims_data,const float output_scale,const int output_zero_point,TfLitePadding padding,TfLiteFusedActivation activation,T * output_data)90 void TestAveragePoolQuantized(
91     const int* input_dims_data, const T* input_data, const float input_scale,
92     const int input_zero_point, const int filter_height, const int filter_width,
93     const int stride_height, const int stride_width,
94     const T* expected_output_data, const int* output_dims_data,
95     const float output_scale, const int output_zero_point,
96     TfLitePadding padding, TfLiteFusedActivation activation, T* output_data) {
97   static_assert(sizeof(T) == 1, "Only int8_t/uint8_t data types allowed.");
98 
99   TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
100   TfLiteIntArray* output_dims = IntArrayFromInts(output_dims_data);
101   const int output_dims_count = ElementCount(*output_dims);
102 
103   constexpr int inputs_size = 1;
104   constexpr int outputs_size = 1;
105   constexpr int tensors_size = inputs_size + outputs_size;
106   TfLiteTensor tensors[tensors_size] = {
107       CreateQuantizedTensor(input_data, input_dims, input_scale,
108                             input_zero_point),
109       CreateQuantizedTensor(output_data, output_dims, output_scale,
110                             output_zero_point),
111   };
112 
113   const TfLiteRegistration registration =
114       tflite::ops::micro::Register_AVERAGE_POOL_2D();
115   ValidatePoolingGoldens(tensors, tensors_size, registration, filter_height,
116                          filter_width, stride_height, stride_width,
117                          expected_output_data, output_dims_count, padding,
118                          activation, output_data);
119 }
120 
TestMaxPoolFloat(const int * input_dims_data,const float * input_data,int filter_width,int filter_height,int stride_width,int stride_height,const float * expected_output_data,const int * output_dims_data,TfLitePadding padding,TfLiteFusedActivation activation,float * output_data)121 void TestMaxPoolFloat(const int* input_dims_data, const float* input_data,
122                       int filter_width, int filter_height, int stride_width,
123                       int stride_height, const float* expected_output_data,
124                       const int* output_dims_data, TfLitePadding padding,
125                       TfLiteFusedActivation activation, float* output_data) {
126   TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
127   TfLiteIntArray* output_dims = IntArrayFromInts(output_dims_data);
128   const int output_dims_count = ElementCount(*output_dims);
129 
130   constexpr int inputs_size = 1;
131   constexpr int outputs_size = 1;
132   constexpr int tensors_size = inputs_size + outputs_size;
133   TfLiteTensor tensors[tensors_size] = {
134       CreateTensor(input_data, input_dims),
135       CreateTensor(output_data, output_dims),
136   };
137 
138   const TfLiteRegistration registration =
139       tflite::ops::micro::Register_MAX_POOL_2D();
140   ValidatePoolingGoldens(tensors, tensors_size, registration, filter_height,
141                          filter_width, stride_height, stride_width,
142                          expected_output_data, output_dims_count, padding,
143                          activation, output_data);
144 }
145 
146 template <typename T>
TestMaxPoolQuantized(const int * input_dims_data,const T * input_data,const float input_scale,const int input_zero_point,const int filter_height,const int filter_width,const int stride_height,const int stride_width,const T * expected_output_data,const int * output_dims_data,const float output_scale,const int output_zero_point,TfLitePadding padding,TfLiteFusedActivation activation,T * output_data)147 void TestMaxPoolQuantized(const int* input_dims_data, const T* input_data,
148                           const float input_scale, const int input_zero_point,
149                           const int filter_height, const int filter_width,
150                           const int stride_height, const int stride_width,
151                           const T* expected_output_data,
152                           const int* output_dims_data, const float output_scale,
153                           const int output_zero_point, TfLitePadding padding,
154                           TfLiteFusedActivation activation, T* output_data) {
155   TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
156   TfLiteIntArray* output_dims = IntArrayFromInts(output_dims_data);
157   const int output_dims_count = ElementCount(*output_dims);
158 
159   constexpr int inputs_size = 1;
160   constexpr int outputs_size = 1;
161   constexpr int tensors_size = inputs_size + outputs_size;
162   TfLiteTensor tensors[tensors_size] = {
163       CreateQuantizedTensor(input_data, input_dims, input_scale,
164                             input_zero_point),
165       CreateQuantizedTensor(output_data, output_dims, output_scale,
166                             output_zero_point),
167   };
168 
169   const TfLiteRegistration registration =
170       tflite::ops::micro::Register_MAX_POOL_2D();
171   ValidatePoolingGoldens(tensors, tensors_size, registration, filter_height,
172                          filter_width, stride_height, stride_width,
173                          expected_output_data, output_dims_count, padding,
174                          activation, output_data);
175 }
176 
177 }  // namespace
178 
179 }  // namespace testing
180 }  // namespace tflite
181 
182 TF_LITE_MICRO_TESTS_BEGIN
183 
TF_LITE_MICRO_TEST(SimpleAveragePoolTestFloat)184 TF_LITE_MICRO_TEST(SimpleAveragePoolTestFloat) {
185   const int input_shape[] = {4, 1, 2, 4, 1};
186   const float input_values[] = {0, 6, 2, 4, 3, 2, 10, 7};
187   const int filter_width = 2;
188   const int filter_height = 2;
189   const int stride_width = 2;
190   const int stride_height = 2;
191   const float golden[] = {2.75, 5.75};
192   const int output_shape[] = {4, 1, 1, 2, 1};
193   float output_data[2];
194   tflite::testing::TestAveragePoolFloat(
195       input_shape, input_values, filter_height, filter_width, stride_height,
196       stride_width, golden, output_shape, kTfLitePaddingValid, kTfLiteActNone,
197       output_data);
198 }
199 
TF_LITE_MICRO_TEST(SimpleAveragePoolTestUint8)200 TF_LITE_MICRO_TEST(SimpleAveragePoolTestUint8) {
201   const int input_shape[] = {4, 1, 2, 4, 1};
202   const uint8_t input_values[] = {0, 24, 8, 16, 12, 8, 40, 28};
203   const int filter_width = 2;
204   const int filter_height = 2;
205   const int stride_width = 2;
206   const int stride_height = 2;
207   const uint8_t golden[] = {11, 23};
208   const int output_shape[] = {4, 1, 1, 2, 1};
209   uint8_t output_data[2];
210 
211   const float input_scale = 0.25;
212   const int input_zero_point = 0;
213   const float output_scale = .25;
214   const int output_zero_point = 0;
215   tflite::testing::TestAveragePoolQuantized(
216       input_shape, input_values, input_scale, input_zero_point, filter_height,
217       filter_width, stride_height, stride_width, golden, output_shape,
218       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone,
219       output_data);
220 }
221 
TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingValidStride2ActNone)222 TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingValidStride2ActNone) {
223   const int input_shape[] = {4, 1, 2, 4, 1};
224   const int8_t input_values[] = {0, -24, 8, 16, 12, 8, -40, 28};
225   const int filter_width = 2;
226   const int filter_height = 2;
227   const int stride_width = 2;
228   const int stride_height = 2;
229   const int8_t golden[] = {-1, 3};
230   const int output_shape[] = {4, 1, 1, 2, 1};
231   int8_t output_data[2];
232 
233   const float input_scale = .25;
234   const int input_zero_point = 0;
235   const float output_scale = .25;
236   const int output_zero_point = 0;
237   tflite::testing::TestAveragePoolQuantized(
238       input_shape, input_values, input_scale, input_zero_point, filter_height,
239       filter_width, stride_height, stride_width, golden, output_shape,
240       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone,
241       output_data);
242 }
243 
TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingValidStride1Stride2Relu)244 TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingValidStride1Stride2Relu) {
245   const int input_shape[] = {4, 1, 2, 4, 1};
246   const int8_t input_values[] = {0, -24, 8, 16, 12, 8, -40, 28};
247   const int filter_width = 2;
248   const int filter_height = 2;
249   const int stride_width = 1;
250   const int stride_height = 2;
251   const int8_t golden[] = {0, 0, 3};
252   const int output_shape[] = {4, 1, 1, 3, 1};
253   int8_t output_data[3];
254 
255   const float input_scale = .25;
256   const int input_zero_point = 0;
257   const float output_scale = .25;
258   const int output_zero_point = 0;
259   tflite::testing::TestAveragePoolQuantized(
260       input_shape, input_values, input_scale, input_zero_point, filter_height,
261       filter_width, stride_height, stride_width, golden, output_shape,
262       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu,
263       output_data);
264 }
265 
TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingValidStride2Stride1ReluN1To1)266 TF_LITE_MICRO_TEST(
267     SimpleAveragePoolTestInt8PaddingValidStride2Stride1ReluN1To1) {
268   const int input_shape[] = {4, 1, 2, 4, 1};
269   const int8_t input_values[] = {0, -24, 8, 16, 12, 8, -40, 28};
270   const int filter_width = 2;
271   const int filter_height = 2;
272   const int stride_width = 2;
273   const int stride_height = 1;
274   const int8_t golden[] = {-1, 3};
275   const int output_shape[] = {4, 1, 1, 2, 1};
276   int8_t output_data[2];
277 
278   const float input_scale = .25;
279   const int input_zero_point = 0;
280   const float output_scale = .25;
281   const int output_zero_point = 0;
282   tflite::testing::TestAveragePoolQuantized(
283       input_shape, input_values, input_scale, input_zero_point, filter_height,
284       filter_width, stride_height, stride_width, golden, output_shape,
285       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActReluN1To1,
286       output_data);
287 }
288 
TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingValidStride2Relu6)289 TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingValidStride2Relu6) {
290   const int input_shape[] = {4, 1, 2, 4, 1};
291   const int8_t input_values[] = {12, -24, 32, 16, 12, 8, 40, 28};
292   const int filter_width = 2;
293   const int filter_height = 2;
294   const int stride_width = 2;
295   const int stride_height = 2;
296   const int8_t golden[] = {2, 24};
297   const int output_shape[] = {4, 1, 1, 2, 1};
298   int8_t output_data[2];
299 
300   const float input_scale = .25;
301   const int input_zero_point = 0;
302   const float output_scale = .25;
303   const int output_zero_point = 0;
304   tflite::testing::TestAveragePoolQuantized(
305       input_shape, input_values, input_scale, input_zero_point, filter_height,
306       filter_width, stride_height, stride_width, golden, output_shape,
307       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu6,
308       output_data);
309 }
310 
TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingSameStride1ActNone)311 TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingSameStride1ActNone) {
312   const int input_shape[] = {4, 1, 2, 4, 1};
313   const int8_t input_values[] = {12, -24, 32, 16, 12, 8, 40, 28};
314   const int filter_width = 2;
315   const int filter_height = 2;
316   const int stride_width = 1;
317   const int stride_height = 1;
318   const int8_t golden[] = {2, 14, 29, 22, 10, 24, 34, 28};
319   const int output_shape[] = {4, 1, 2, 4, 1};
320   int8_t output_data[8];
321 
322   const float input_scale = .25;
323   const int input_zero_point = 0;
324   const float output_scale = .25;
325   const int output_zero_point = 0;
326   tflite::testing::TestAveragePoolQuantized(
327       input_shape, input_values, input_scale, input_zero_point, filter_height,
328       filter_width, stride_height, stride_width, golden, output_shape,
329       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone,
330       output_data);
331 }
332 
TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloat)333 TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloat) {
334   const int input_shape[] = {4, 1, 2, 4, 1};
335   const float input_values[] = {0, 6, 2, 4, 3, 2, 10, 7};
336   const int filter_width = 2;
337   const int filter_height = 2;
338   const int stride_width = 2;
339   const int stride_height = 2;
340   const float golden[] = {6, 10};
341   const int output_shape[] = {4, 1, 1, 2, 1};
342   float output_data[2];
343   tflite::testing::TestMaxPoolFloat(input_shape, input_values, filter_height,
344                                     filter_width, stride_height, stride_width,
345                                     golden, output_shape, kTfLitePaddingValid,
346                                     kTfLiteActNone, output_data);
347 }
348 
TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloatRelu)349 TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloatRelu) {
350   const int input_shape[] = {4, 1, 2, 4, 1};
351   const float input_values[] = {-1, -6, 2, 4, -3, -2, 10.5, 7};
352   const int filter_width = 2;
353   const int filter_height = 2;
354   const int stride_width = 2;
355   const int stride_height = 2;
356   const float golden[] = {0, 10.5};
357   const int output_shape[] = {4, 1, 1, 2, 1};
358   float output_data[2];
359   tflite::testing::TestMaxPoolFloat(input_shape, input_values, filter_height,
360                                     filter_width, stride_height, stride_width,
361                                     golden, output_shape, kTfLitePaddingValid,
362                                     kTfLiteActRelu, output_data);
363 }
364 
TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloatReluN1To1)365 TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloatReluN1To1) {
366   const int input_shape[] = {4, 1, 2, 4, 1};
367   const float input_values1[] = {-2.75, -6, 0.2, 0.4, -3, -2, -0.3, 0.7};
368   const int filter_width = 2;
369   const int filter_height = 2;
370   const int stride_width = 2;
371   const int stride_height = 2;
372   const float golden1[] = {-1.0, 0.7};
373   const int output_shape[] = {4, 1, 1, 2, 1};
374   float output_data[2];
375   tflite::testing::TestMaxPoolFloat(input_shape, input_values1, filter_height,
376                                     filter_width, stride_height, stride_width,
377                                     golden1, output_shape, kTfLitePaddingValid,
378                                     kTfLiteActReluN1To1, output_data);
379 
380   const float input_values2[] = {-2.75, -6, -2, -4, -3, -2, 10, -7};
381   const float golden2[] = {-1.0, 1.0};
382   tflite::testing::TestMaxPoolFloat(input_shape, input_values2, filter_height,
383                                     filter_width, stride_height, stride_width,
384                                     golden2, output_shape, kTfLitePaddingValid,
385                                     kTfLiteActReluN1To1, output_data);
386 }
387 
TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloatRelu6)388 TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloatRelu6) {
389   const int input_shape[] = {4, 1, 2, 4, 1};
390   const float input_values1[] = {-1.5, -6, 12, 4, -3, -2, 10, 7};
391   const int filter_width = 2;
392   const int filter_height = 2;
393   const int stride_width = 2;
394   const int stride_height = 2;
395   const float golden1[] = {0, 6};
396   const int output_shape[] = {4, 1, 1, 2, 1};
397   float output_data[2];
398   tflite::testing::TestMaxPoolFloat(input_shape, input_values1, filter_height,
399                                     filter_width, stride_height, stride_width,
400                                     golden1, output_shape, kTfLitePaddingValid,
401                                     kTfLiteActRelu6, output_data);
402 
403   const float input_values2[] = {0, 4.5, 12, 4, 3, 2, 10, 7};
404   const float golden2[] = {4.5, 6};
405   tflite::testing::TestMaxPoolFloat(input_shape, input_values2, filter_height,
406                                     filter_width, stride_height, stride_width,
407                                     golden2, output_shape, kTfLitePaddingValid,
408                                     kTfLiteActRelu6, output_data);
409 }
410 
TF_LITE_MICRO_TEST(SimpleMaxPoolTestPaddingSameStride1)411 TF_LITE_MICRO_TEST(SimpleMaxPoolTestPaddingSameStride1) {
412   const int input_shape[] = {4, 1, 2, 4, 1};
413   const float input_values[] = {0, 6, 2, 4, 3, 2, 10, 7};
414   const int filter_width = 2;
415   const int filter_height = 2;
416   const int stride_width = 1;
417   const int stride_height = 1;
418   const float golden[] = {6, 10, 10, 7, 3, 10, 10, 7};
419   const int output_shape[] = {4, 1, 2, 4, 1};
420   float output_data[8];
421   tflite::testing::TestMaxPoolFloat(input_shape, input_values, filter_height,
422                                     filter_width, stride_height, stride_width,
423                                     golden, output_shape, kTfLitePaddingSame,
424                                     kTfLiteActNone, output_data);
425 }
426 
TF_LITE_MICRO_TEST(SimpleMaxPoolTestPaddingValidStride1)427 TF_LITE_MICRO_TEST(SimpleMaxPoolTestPaddingValidStride1) {
428   const int input_shape[] = {4, 1, 2, 4, 1};
429   const float input_values[] = {0, 6, 2, 4, 3, 2, 10, 7};
430   const int filter_width = 2;
431   const int filter_height = 2;
432   const int stride_width = 1;
433   const int stride_height = 1;
434   const float golden[] = {6, 10, 10};
435   const int output_shape[] = {4, 1, 1, 3, 1};
436   float output_data[8];
437   tflite::testing::TestMaxPoolFloat(input_shape, input_values, filter_height,
438                                     filter_width, stride_height, stride_width,
439                                     golden, output_shape, kTfLitePaddingValid,
440                                     kTfLiteActNone, output_data);
441 }
442 
TF_LITE_MICRO_TEST(SimpleMaxPoolTestUInt8ActNone)443 TF_LITE_MICRO_TEST(SimpleMaxPoolTestUInt8ActNone) {
444   const int input_shape[] = {4, 1, 2, 4, 1};
445   const uint8_t input_values[] = {0, 12, 4, 8, 6, 4, 20, 14};
446   const int filter_width = 2;
447   const int filter_height = 2;
448   const int stride_width = 2;
449   const int stride_height = 2;
450   const uint8_t golden[] = {12, 20};
451   const int output_shape[] = {4, 1, 1, 2, 1};
452   uint8_t output_data[2];
453 
454   const float input_scale = 1.0;
455   const int input_zero_point = 0;
456   const float output_scale = 1.0;
457   const int output_zero_point = 0;
458   tflite::testing::TestMaxPoolQuantized(
459       input_shape, input_values, input_scale, input_zero_point, filter_height,
460       filter_width, stride_height, stride_width, golden, output_shape,
461       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone,
462       output_data);
463 }
464 
TF_LITE_MICRO_TEST(MaxPoolTestUInt8ActRelu)465 TF_LITE_MICRO_TEST(MaxPoolTestUInt8ActRelu) {
466   const int input_shape[] = {4, 1, 2, 4, 1};
467   const uint8_t input_values[] = {0, 4, 2, 4, 3, 2, 14, 7};
468   const int filter_width = 2;
469   const int filter_height = 2;
470   const int stride_width = 2;
471   const int stride_height = 2;
472   const uint8_t golden[] = {4, 14};
473   const int output_shape[] = {4, 1, 1, 2, 1};
474   uint8_t output_data[2];
475 
476   const float input_scale = 1.0;
477   const int input_zero_point = 4;
478   const float output_scale = 1.0;
479   const int output_zero_point = 4;
480   tflite::testing::TestMaxPoolQuantized(
481       input_shape, input_values, input_scale, input_zero_point, filter_height,
482       filter_width, stride_height, stride_width, golden, output_shape,
483       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu,
484       output_data);
485 }
486 
TF_LITE_MICRO_TEST(MaxPoolTestUInt8ActReluN1To1)487 TF_LITE_MICRO_TEST(MaxPoolTestUInt8ActReluN1To1) {
488   const int input_shape[] = {4, 1, 2, 4, 1};
489   const uint8_t input_values[] = {0, 4, 2, 4, 3, 2, 14, 7};
490   const int filter_width = 2;
491   const int filter_height = 2;
492   const int stride_width = 2;
493   const int stride_height = 2;
494   const uint8_t golden[] = {3, 5};
495   const int output_shape[] = {4, 1, 1, 2, 1};
496   uint8_t output_data[2];
497 
498   const float input_scale = 1.0;
499   const int input_zero_point = 4;
500   const float output_scale = 1.0;
501   const int output_zero_point = 4;
502   tflite::testing::TestAveragePoolQuantized(
503       input_shape, input_values, input_scale, input_zero_point, filter_height,
504       filter_width, stride_height, stride_width, golden, output_shape,
505       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActReluN1To1,
506       output_data);
507 }
508 
TF_LITE_MICRO_TEST(MaxPoolTestUInt8ActRelu6)509 TF_LITE_MICRO_TEST(MaxPoolTestUInt8ActRelu6) {
510   const int input_shape[] = {4, 1, 2, 4, 1};
511   const uint8_t input_values1[] = {12, 0, 36, 20, 6, 8, 32, 26};
512   const int filter_width = 2;
513   const int filter_height = 2;
514   const int stride_width = 2;
515   const int stride_height = 2;
516   const uint8_t golden1[] = {12, 24};
517   const int output_shape[] = {4, 1, 1, 2, 1};
518   uint8_t output_data[8];
519 
520   const float input_scale = 0.5;
521   const int input_zero_point = 12;
522   const float output_scale = 0.5;
523   const int output_zero_point = 12;
524   tflite::testing::TestMaxPoolQuantized(
525       input_shape, input_values1, input_scale, input_zero_point, filter_height,
526       filter_width, stride_height, stride_width, golden1, output_shape,
527       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu6,
528       output_data);
529 
530   const uint8_t input_values2[] = {12, 21, 36, 16, 18, 16, 32, 26};
531 
532   const uint8_t golden2[] = {21, 24};
533   tflite::testing::TestMaxPoolQuantized(
534       input_shape, input_values2, input_scale, input_zero_point, filter_height,
535       filter_width, stride_height, stride_width, golden2, output_shape,
536       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu6,
537       output_data);
538 }
539 
TF_LITE_MICRO_TEST(MaxPoolTestUInt8PaddingSameStride1)540 TF_LITE_MICRO_TEST(MaxPoolTestUInt8PaddingSameStride1) {
541   const int input_shape[] = {4, 1, 2, 4, 1};
542   const uint8_t input_values1[] = {0, 6, 2, 4, 3, 2, 10, 7};
543   const int filter_width = 2;
544   const int filter_height = 2;
545   const int stride_width = 1;
546   const int stride_height = 1;
547   const uint8_t golden1[] = {6, 10, 10, 7, 3, 10, 10, 7};
548   const int output_shape[] = {4, 1, 2, 4, 1};
549   uint8_t output_data[8];
550 
551   const float input_scale = 1.0;
552   const int input_zero_point = 0;
553   const float output_scale = 1.0;
554   const int output_zero_point = 0;
555   tflite::testing::TestMaxPoolQuantized(
556       input_shape, input_values1, input_scale, input_zero_point, filter_height,
557       filter_width, stride_height, stride_width, golden1, output_shape,
558       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone,
559       output_data);
560 }
561 
TF_LITE_MICRO_TEST(MaxPoolTestUInt8PaddingValidStride1)562 TF_LITE_MICRO_TEST(MaxPoolTestUInt8PaddingValidStride1) {
563   const int input_shape[] = {4, 1, 2, 4, 1};
564   const uint8_t input_values1[] = {0, 6, 2, 4, 3, 2, 10, 7};
565   const int filter_width = 2;
566   const int filter_height = 2;
567   const int stride_width = 1;
568   const int stride_height = 1;
569   const uint8_t golden1[] = {6, 10, 10};
570   const int output_shape[] = {4, 1, 1, 3, 1};
571   uint8_t output_data[3];
572 
573   const float input_scale = 1.0;
574   const int input_zero_point = 0;
575   const float output_scale = 1.0;
576   const int output_zero_point = 0;
577   tflite::testing::TestMaxPoolQuantized(
578       input_shape, input_values1, input_scale, input_zero_point, filter_height,
579       filter_width, stride_height, stride_width, golden1, output_shape,
580       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone,
581       output_data);
582 }
583 
TF_LITE_MICRO_TEST(SimpleMaxPoolTestInt8ActNone)584 TF_LITE_MICRO_TEST(SimpleMaxPoolTestInt8ActNone) {
585   const int input_shape[] = {4, 1, 2, 4, 1};
586   const int8_t input_values1[] = {0, 6, 2, 4, 3, 2, 10, 7};
587   const int filter_width = 2;
588   const int filter_height = 2;
589   const int stride_width = 2;
590   const int stride_height = 2;
591   const int8_t golden1[] = {6, 10};
592   const int output_shape[] = {4, 1, 1, 2, 1};
593   int8_t output_data[2];
594 
595   const float input_scale = 1.0;
596   const int input_zero_point = 0;
597   const float output_scale = 1.0;
598   const int output_zero_point = 0;
599   tflite::testing::TestMaxPoolQuantized(
600       input_shape, input_values1, input_scale, input_zero_point, filter_height,
601       filter_width, stride_height, stride_width, golden1, output_shape,
602       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone,
603       output_data);
604 }
605 
TF_LITE_MICRO_TEST(MaxPoolTestInt8ActRelu)606 TF_LITE_MICRO_TEST(MaxPoolTestInt8ActRelu) {
607   const int input_shape[] = {4, 1, 2, 4, 1};
608   const int8_t input_values1[] = {-3, -12, 4, 8, -6, -4, 20, 14};
609   const int filter_width = 2;
610   const int filter_height = 2;
611   const int stride_width = 2;
612   const int stride_height = 2;
613   const int8_t golden1[] = {0, 20};
614   const int output_shape[] = {4, 1, 1, 2, 1};
615   int8_t output_data[2];
616 
617   const float input_scale = 0.5;
618   const int input_zero_point = 0;
619   const float output_scale = 0.5;
620   const int output_zero_point = 0;
621   tflite::testing::TestMaxPoolQuantized(
622       input_shape, input_values1, input_scale, input_zero_point, filter_height,
623       filter_width, stride_height, stride_width, golden1, output_shape,
624       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu,
625       output_data);
626 }
627 
TF_LITE_MICRO_TEST(MaxPoolTestInt8ActReluN1To1)628 TF_LITE_MICRO_TEST(MaxPoolTestInt8ActReluN1To1) {
629   const int input_shape[] = {4, 1, 2, 4, 1};
630   const int8_t input_values1[] = {-2, -6, -2, -4, -3, -2, 10, 7};
631   const int filter_width = 2;
632   const int filter_height = 2;
633   const int stride_width = 2;
634   const int stride_height = 2;
635   const int8_t golden1[] = {-1, 1};
636   const int output_shape[] = {4, 1, 1, 2, 1};
637   int8_t output_data[2];
638 
639   const float input_scale = 1.0;
640   const int input_zero_point = 0;
641   const float output_scale = 1.0;
642   const int output_zero_point = 0;
643   tflite::testing::TestMaxPoolQuantized(
644       input_shape, input_values1, input_scale, input_zero_point, filter_height,
645       filter_width, stride_height, stride_width, golden1, output_shape,
646       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActReluN1To1,
647       output_data);
648 }
649 
TF_LITE_MICRO_TEST(MaxPoolTestInt8ActRelu6)650 TF_LITE_MICRO_TEST(MaxPoolTestInt8ActRelu6) {
651   const int input_shape[] = {4, 1, 2, 4, 1};
652   const int8_t input_values1[] = {0, -6, 12, 4, -3, -2, 10, 7};
653   const int filter_width = 2;
654   const int filter_height = 2;
655   const int stride_width = 2;
656   const int stride_height = 2;
657   const int8_t golden1[] = {0, 6};
658   const int output_shape[] = {4, 1, 1, 2, 1};
659   int8_t output_data[2];
660 
661   const float input_scale = 1.0;
662   const int input_zero_point = 0;
663   const float output_scale = 1.0;
664   const int output_zero_point = 0;
665   tflite::testing::TestMaxPoolQuantized(
666       input_shape, input_values1, input_scale, input_zero_point, filter_height,
667       filter_width, stride_height, stride_width, golden1, output_shape,
668       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu6,
669       output_data);
670 }
671 
TF_LITE_MICRO_TEST(MaxPoolTestUInt8PaddingSameStride1)672 TF_LITE_MICRO_TEST(MaxPoolTestUInt8PaddingSameStride1) {
673   const int input_shape[] = {4, 1, 2, 4, 1};
674   const uint8_t input_values1[] = {0, 6, 2, 4, 3, 2, 10, 7};
675   const int filter_width = 2;
676   const int filter_height = 2;
677   const int stride_width = 1;
678   const int stride_height = 1;
679   const uint8_t golden1[] = {6, 10, 10, 7, 3, 10, 10, 7};
680   const int output_shape[] = {4, 1, 2, 4, 1};
681   uint8_t output_data[8];
682 
683   const float input_scale = 1.0;
684   const int input_zero_point = 0;
685   const float output_scale = 1.0;
686   const int output_zero_point = 0;
687   tflite::testing::TestMaxPoolQuantized(
688       input_shape, input_values1, input_scale, input_zero_point, filter_height,
689       filter_width, stride_height, stride_width, golden1, output_shape,
690       output_scale, output_zero_point, kTfLitePaddingSame, kTfLiteActNone,
691       output_data);
692 }
693 
TF_LITE_MICRO_TEST(MaxPoolTestUInt8PaddingValidStride1)694 TF_LITE_MICRO_TEST(MaxPoolTestUInt8PaddingValidStride1) {
695   const int input_shape[] = {4, 1, 2, 4, 1};
696   const uint8_t input_values1[] = {0, 6, 2, 4, 3, 2, 10, 7};
697   const int filter_width = 2;
698   const int filter_height = 2;
699   const int stride_width = 1;
700   const int stride_height = 1;
701   const uint8_t golden1[] = {6, 10, 10};
702   const int output_shape[] = {4, 1, 1, 3, 1};
703   uint8_t output_data[3];
704 
705   const float input_scale = 1.0;
706   const int input_zero_point = 0;
707   const float output_scale = 1.0;
708   const int output_zero_point = 0;
709   tflite::testing::TestMaxPoolQuantized(
710       input_shape, input_values1, input_scale, input_zero_point, filter_height,
711       filter_width, stride_height, stride_width, golden1, output_shape,
712       output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone,
713       output_data);
714 }
715 
716 TF_LITE_MICRO_TESTS_END
717