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