• 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 "tensorflow/lite/c/builtin_op_data.h"
17 #include "tensorflow/lite/c/common.h"
18 #include "tensorflow/lite/micro/all_ops_resolver.h"
19 #include "tensorflow/lite/micro/debug_log.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 
TestSplitTwoOutputsFloat(const int * input_dims_data,const float * input_data,const int * axis_dims_data,const int32_t * axis_data,const int * output1_dims_data,const float * expected_output1_data,const int * output2_dims_data,const float * expected_output2_data,float * output1_data,float * output2_data)27 void TestSplitTwoOutputsFloat(
28     const int* input_dims_data, const float* input_data,
29     const int* axis_dims_data, const int32_t* axis_data,
30     const int* output1_dims_data, const float* expected_output1_data,
31     const int* output2_dims_data, const float* expected_output2_data,
32     float* output1_data, float* output2_data) {
33   TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
34   TfLiteIntArray* axis_dims = IntArrayFromInts(axis_dims_data);
35   TfLiteIntArray* output1_dims = IntArrayFromInts(output1_dims_data);
36   TfLiteIntArray* output2_dims = IntArrayFromInts(output2_dims_data);
37   const int output1_dims_count = ElementCount(*output1_dims);
38   const int output2_dims_count = ElementCount(*output2_dims);
39 
40   constexpr int input_size = 1;
41   constexpr int output_size = 2;
42   constexpr int axis_size = 1;
43   constexpr int tensors_size = input_size + output_size + axis_size;
44   TfLiteTensor tensors[tensors_size] = {
45       CreateTensor(axis_data, axis_dims), CreateTensor(input_data, input_dims),
46       CreateTensor(output1_data, output1_dims),
47       CreateTensor(output2_data, output2_dims)};
48 
49   // Currently only support constant axis tensor.
50   tensors[0].allocation_type = kTfLiteMmapRo;
51   // Place a unique value in the uninitialized output buffer.
52   for (int i = 0; i < output1_dims_count; ++i) {
53     output1_data[i] = 23;
54   }
55 
56   for (int i = 0; i < output2_dims_count; ++i) {
57     output2_data[i] = 23;
58   }
59 
60   int inputs_array_data[] = {2, 0, 1};
61   TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data);
62   int outputs_array_data[] = {2, 2, 3};
63   TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data);
64 
65   const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT();
66   micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array,
67                              outputs_array, nullptr);
68 
69   TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare());
70   TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke());
71 
72   for (int i = 0; i < output1_dims_count; ++i) {
73     TF_LITE_MICRO_EXPECT_NEAR(expected_output1_data[i], output1_data[i], 1e-5f);
74   }
75 
76   for (int i = 0; i < output2_dims_count; ++i) {
77     TF_LITE_MICRO_EXPECT_NEAR(expected_output2_data[i], output2_data[i], 1e-5f);
78   }
79 }
80 
TestSplitFourOutputsFloat(const int * input_dims_data,const float * input_data,const int * axis_dims_data,const int32_t * axis_data,const int * output1_dims_data,const float * expected_output1_data,const int * output2_dims_data,const float * expected_output2_data,const int * output3_dims_data,const float * expected_output3_data,const int * output4_dims_data,const float * expected_output4_data,float * output1_data,float * output2_data,float * output3_data,float * output4_data)81 void TestSplitFourOutputsFloat(
82     const int* input_dims_data, const float* input_data,
83     const int* axis_dims_data, const int32_t* axis_data,
84     const int* output1_dims_data, const float* expected_output1_data,
85     const int* output2_dims_data, const float* expected_output2_data,
86     const int* output3_dims_data, const float* expected_output3_data,
87     const int* output4_dims_data, const float* expected_output4_data,
88     float* output1_data, float* output2_data, float* output3_data,
89     float* output4_data) {
90   TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
91   TfLiteIntArray* axis_dims = IntArrayFromInts(axis_dims_data);
92   TfLiteIntArray* output1_dims = IntArrayFromInts(output1_dims_data);
93   TfLiteIntArray* output2_dims = IntArrayFromInts(output2_dims_data);
94   TfLiteIntArray* output3_dims = IntArrayFromInts(output3_dims_data);
95   TfLiteIntArray* output4_dims = IntArrayFromInts(output4_dims_data);
96   const int output1_dims_count = ElementCount(*output1_dims);
97   const int output2_dims_count = ElementCount(*output2_dims);
98   const int output3_dims_count = ElementCount(*output3_dims);
99   const int output4_dims_count = ElementCount(*output4_dims);
100 
101   constexpr int input_size = 1;
102   constexpr int output_size = 4;
103   constexpr int axis_size = 1;
104   constexpr int tensors_size = input_size + output_size + axis_size;
105   TfLiteTensor tensors[tensors_size] = {
106       CreateTensor(axis_data, axis_dims),
107       CreateTensor(input_data, input_dims),
108       CreateTensor(output1_data, output1_dims),
109       CreateTensor(output2_data, output2_dims),
110       CreateTensor(output3_data, output1_dims),
111       CreateTensor(output4_data, output1_dims)};
112 
113   // Currently only support constant axis tensor.
114   tensors[0].allocation_type = kTfLiteMmapRo;
115   // Place a unique value in the uninitialized output buffer.
116   for (int i = 0; i < output1_dims_count; ++i) {
117     output1_data[i] = 23;
118   }
119   for (int i = 0; i < output2_dims_count; ++i) {
120     output2_data[i] = 23;
121   }
122   for (int i = 0; i < output3_dims_count; ++i) {
123     output3_data[i] = 23;
124   }
125   for (int i = 0; i < output4_dims_count; ++i) {
126     output4_data[i] = 23;
127   }
128 
129   int inputs_array_data[] = {2, 0, 1};
130   TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data);
131   int outputs_array_data[] = {4, 2, 3, 4, 5};
132   TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data);
133 
134   const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT();
135   micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array,
136                              outputs_array, nullptr);
137 
138   TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare());
139   TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke());
140 
141   for (int i = 0; i < output1_dims_count; ++i) {
142     TF_LITE_MICRO_EXPECT_NEAR(expected_output1_data[i], output1_data[i], 1e-5f);
143   }
144   for (int i = 0; i < output2_dims_count; ++i) {
145     TF_LITE_MICRO_EXPECT_NEAR(expected_output2_data[i], output2_data[i], 1e-5f);
146   }
147   for (int i = 0; i < output3_dims_count; ++i) {
148     TF_LITE_MICRO_EXPECT_NEAR(expected_output3_data[i], output3_data[i], 1e-5f);
149   }
150   for (int i = 0; i < output4_dims_count; ++i) {
151     TF_LITE_MICRO_EXPECT_NEAR(expected_output4_data[i], output4_data[i], 1e-5f);
152   }
153 }
154 
TestSplitTwoOutputsQuantized(const int * input_dims_data,const uint8_t * input_data,const int * axis_dims_data,const int32_t * axis_data,const int * output1_dims_data,const uint8_t * expected_output1_data,const int * output2_dims_data,const uint8_t * expected_output2_data,uint8_t * output1_data,uint8_t * output2_data)155 void TestSplitTwoOutputsQuantized(
156     const int* input_dims_data, const uint8_t* input_data,
157     const int* axis_dims_data, const int32_t* axis_data,
158     const int* output1_dims_data, const uint8_t* expected_output1_data,
159     const int* output2_dims_data, const uint8_t* expected_output2_data,
160     uint8_t* output1_data, uint8_t* output2_data) {
161   TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
162   TfLiteIntArray* axis_dims = IntArrayFromInts(axis_dims_data);
163   TfLiteIntArray* output1_dims = IntArrayFromInts(output1_dims_data);
164   TfLiteIntArray* output2_dims = IntArrayFromInts(output2_dims_data);
165   const int output1_dims_count = ElementCount(*output1_dims);
166   const int output2_dims_count = ElementCount(*output2_dims);
167 
168   constexpr int input_size = 1;
169   constexpr int output_size = 2;
170   constexpr int axis_size = 1;
171   constexpr int tensors_size = input_size + output_size + axis_size;
172   TfLiteTensor tensors[tensors_size] = {
173       CreateTensor(axis_data, axis_dims),
174       CreateQuantizedTensor(input_data, input_dims, 0, 10),
175       CreateQuantizedTensor(output1_data, output1_dims, 0, 10),
176       CreateQuantizedTensor(output2_data, output2_dims, 0, 10)};
177 
178   // Currently only support constant axis tensor.
179   tensors[0].allocation_type = kTfLiteMmapRo;
180 
181   // Place a unique value in the uninitialized output buffer.
182   for (int i = 0; i < output1_dims_count; ++i) {
183     output1_data[i] = 23;
184   }
185 
186   for (int i = 0; i < output2_dims_count; ++i) {
187     output2_data[i] = 23;
188   }
189 
190   int inputs_array_data[] = {2, 0, 1};
191   TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data);
192   int outputs_array_data[] = {2, 2, 3};
193   TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data);
194 
195   const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT();
196   micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array,
197                              outputs_array, nullptr);
198 
199   TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare());
200   TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke());
201 
202   for (int i = 0; i < output1_dims_count; ++i) {
203     TF_LITE_MICRO_EXPECT_EQ(expected_output1_data[i], output1_data[i]);
204   }
205 
206   for (int i = 0; i < output2_dims_count; ++i) {
207     TF_LITE_MICRO_EXPECT_EQ(expected_output2_data[i], output2_data[i]);
208   }
209 }
210 
TestSplitTwoOutputsQuantized32(const int * input_dims_data,const int32_t * input_data,const int * axis_dims_data,const int32_t * axis_data,const int * output1_dims_data,const int32_t * expected_output1_data,const int * output2_dims_data,const int32_t * expected_output2_data,int32_t * output1_data,int32_t * output2_data)211 void TestSplitTwoOutputsQuantized32(
212     const int* input_dims_data, const int32_t* input_data,
213     const int* axis_dims_data, const int32_t* axis_data,
214     const int* output1_dims_data, const int32_t* expected_output1_data,
215     const int* output2_dims_data, const int32_t* expected_output2_data,
216     int32_t* output1_data, int32_t* output2_data) {
217   TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
218   TfLiteIntArray* axis_dims = IntArrayFromInts(axis_dims_data);
219   TfLiteIntArray* output1_dims = IntArrayFromInts(output1_dims_data);
220   TfLiteIntArray* output2_dims = IntArrayFromInts(output2_dims_data);
221   const int output1_dims_count = ElementCount(*output1_dims);
222   const int output2_dims_count = ElementCount(*output2_dims);
223 
224   constexpr int input_size = 1;
225   constexpr int output_size = 2;
226   constexpr int axis_size = 1;
227   constexpr int tensors_size = input_size + output_size + axis_size;
228   TfLiteTensor tensors[tensors_size] = {
229       CreateTensor(axis_data, axis_dims), CreateTensor(input_data, input_dims),
230       CreateTensor(output1_data, output1_dims),
231       CreateTensor(output2_data, output2_dims)};
232 
233   // Currently only support constant axis tensor.
234   tensors[0].allocation_type = kTfLiteMmapRo;
235 
236   // Place a unique value in the uninitialized output buffer.
237   for (int i = 0; i < output1_dims_count; ++i) {
238     output1_data[i] = 23;
239   }
240 
241   for (int i = 0; i < output2_dims_count; ++i) {
242     output2_data[i] = 23;
243   }
244 
245   int inputs_array_data[] = {2, 0, 1};
246   TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data);
247   int outputs_array_data[] = {2, 2, 3};
248   TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data);
249 
250   const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT();
251   micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array,
252                              outputs_array, nullptr);
253 
254   TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare());
255   TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke());
256 
257   for (int i = 0; i < output1_dims_count; ++i) {
258     TF_LITE_MICRO_EXPECT_EQ(expected_output1_data[i], output1_data[i]);
259   }
260 
261   for (int i = 0; i < output2_dims_count; ++i) {
262     TF_LITE_MICRO_EXPECT_EQ(expected_output2_data[i], output2_data[i]);
263   }
264 }
265 
266 }  // namespace testing
267 }  // namespace tflite
268 
269 TF_LITE_MICRO_TESTS_BEGIN
270 
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisZero)271 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisZero) {
272   const int input_shape[] = {4, 2, 2, 2, 2};
273   const float input_data[] = {1, 2,  3,  4,  5,  6,  7,  8,
274                               9, 10, 11, 12, 13, 14, 15, 16};
275   const int axis_shape[] = {1, 1};
276   const int32_t axis_data[] = {0};
277   const int output1_shape[] = {4, 1, 2, 2, 2};
278   const float golden1[] = {1, 2, 3, 4, 5, 6, 7, 8};
279   const int output2_shape[] = {4, 1, 2, 2, 2};
280   const float golden2[] = {9, 10, 11, 12, 13, 14, 15, 16};
281 
282   constexpr int output1_dims_count = 8;
283   constexpr int output2_dims_count = 8;
284   float output1_data[output1_dims_count];
285   float output2_data[output2_dims_count];
286   tflite::testing::TestSplitTwoOutputsFloat(
287       input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
288       output2_shape, golden2, output1_data, output2_data);
289 }
290 
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisOne)291 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisOne) {
292   const int input_shape[] = {4, 2, 2, 2, 2};
293   const float input_data[] = {1, 2,  3,  4,  5,  6,  7,  8,
294                               9, 10, 11, 12, 13, 14, 15, 16};
295   const int axis_shape[] = {1, 1};
296   const int32_t axis_data[] = {1};
297   const int output1_shape[] = {4, 2, 1, 2, 2};
298   const float golden1[] = {1, 2, 3, 4, 9, 10, 11, 12};
299   const int output2_shape[] = {4, 2, 1, 2, 2};
300   const float golden2[] = {5, 6, 7, 8, 13, 14, 15, 16};
301 
302   constexpr int output1_dims_count = 8;
303   constexpr int output2_dims_count = 8;
304   float output1_data[output1_dims_count];
305   float output2_data[output2_dims_count];
306   tflite::testing::TestSplitTwoOutputsFloat(
307       input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
308       output2_shape, golden2, output1_data, output2_data);
309 }
310 
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisTwo)311 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisTwo) {
312   const int input_shape[] = {4, 2, 2, 2, 2};
313   const float input_data[] = {1, 2,  3,  4,  5,  6,  7,  8,
314                               9, 10, 11, 12, 13, 14, 15, 16};
315   const int axis_shape[] = {1, 1};
316   const int32_t axis_data[] = {2};
317   const int output1_shape[] = {4, 2, 2, 1, 2};
318   const float golden1[] = {1, 2, 5, 6, 9, 10, 13, 14};
319   const int output2_shape[] = {4, 2, 2, 1, 2};
320   const float golden2[] = {3, 4, 7, 8, 11, 12, 15, 16};
321 
322   constexpr int output1_dims_count = 8;
323   constexpr int output2_dims_count = 8;
324   float output1_data[output1_dims_count];
325   float output2_data[output2_dims_count];
326   tflite::testing::TestSplitTwoOutputsFloat(
327       input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
328       output2_shape, golden2, output1_data, output2_data);
329 }
330 
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisThree)331 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisThree) {
332   const int input_shape[] = {4, 2, 2, 2, 2};
333   const float input_data[] = {1, 2,  3,  4,  5,  6,  7,  8,
334                               9, 10, 11, 12, 13, 14, 15, 16};
335   const int axis_shape[] = {1, 1};
336   const int32_t axis_data[] = {3};
337   const int output1_shape[] = {4, 2, 2, 2, 1};
338   const float golden1[] = {1, 3, 5, 7, 9, 11, 13, 15};
339   const int output2_shape[] = {4, 2, 2, 2, 1};
340   const float golden2[] = {2, 4, 6, 8, 10, 12, 14, 16};
341 
342   constexpr int output1_dims_count = 8;
343   constexpr int output2_dims_count = 8;
344   float output1_data[output1_dims_count];
345   float output2_data[output2_dims_count];
346   tflite::testing::TestSplitTwoOutputsFloat(
347       input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
348       output2_shape, golden2, output1_data, output2_data);
349 }
350 
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalNegativeAxis)351 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalNegativeAxis) {
352   const int input_shape[] = {4, 2, 2, 2, 2};
353   const float input_data[] = {1, 2,  3,  4,  5,  6,  7,  8,
354                               9, 10, 11, 12, 13, 14, 15, 16};
355   const int axis_shape[] = {1, 1};
356   const int32_t axis_data[] = {-4};
357   const int output1_shape[] = {4, 1, 2, 2, 2};
358   const float golden1[] = {1, 2, 3, 4, 5, 6, 7, 8};
359   const int output2_shape[] = {4, 1, 2, 2, 2};
360   const float golden2[] = {9, 10, 11, 12, 13, 14, 15, 16};
361 
362   constexpr int output1_dims_count = 8;
363   constexpr int output2_dims_count = 8;
364   float output1_data[output1_dims_count];
365   float output2_data[output2_dims_count];
366   tflite::testing::TestSplitTwoOutputsFloat(
367       input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
368       output2_shape, golden2, output1_data, output2_data);
369 }
370 
TF_LITE_MICRO_TEST(FourSplit)371 TF_LITE_MICRO_TEST(FourSplit) {
372   const int input_shape[] = {1, 4};
373   const float input_data[] = {1, 2, 3, 4};
374   const int axis_shape[] = {1, 1};
375   const int32_t axis_data[] = {0};
376   const int output1_shape[] = {1, 1};
377   const float golden1[] = {1};
378   const int output2_shape[] = {1, 1};
379   const float golden2[] = {2};
380   const int output3_shape[] = {1, 1};
381   const float golden3[] = {3};
382   const int output4_shape[] = {1, 1};
383   const float golden4[] = {4};
384 
385   constexpr int output1_dims_count = 1;
386   constexpr int output2_dims_count = 1;
387   constexpr int output3_dims_count = 1;
388   constexpr int output4_dims_count = 1;
389   float output1_data[output1_dims_count];
390   float output2_data[output2_dims_count];
391   float output3_data[output3_dims_count];
392   float output4_data[output4_dims_count];
393   tflite::testing::TestSplitFourOutputsFloat(
394       input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
395       output2_shape, golden2, output3_shape, golden3, output4_shape, golden4,
396       output1_data, output2_data, output3_data, output4_data);
397 }
398 
TF_LITE_MICRO_TEST(TwoSplitOneDimensional)399 TF_LITE_MICRO_TEST(TwoSplitOneDimensional) {
400   const int input_shape[] = {1, 2};
401   const float input_data[] = {1, 2};
402   const int axis_shape[] = {1, 1};
403   const int32_t axis_data[] = {0};
404   const int output1_shape[] = {1, 1};
405   const float golden1[] = {1};
406   const int output2_shape[] = {1, 1};
407   const float golden2[] = {2};
408 
409   constexpr int output1_dims_count = 8;
410   constexpr int output2_dims_count = 8;
411   float output1_data[output1_dims_count];
412   float output2_data[output2_dims_count];
413   tflite::testing::TestSplitTwoOutputsFloat(
414       input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
415       output2_shape, golden2, output1_data, output2_data);
416 }
417 
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalQuantized)418 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalQuantized) {
419   const int input_shape[] = {4, 2, 2, 2, 2};
420   const uint8_t input_data[] = {1, 2,  3,  4,  5,  6,  7,  8,
421                                 9, 10, 11, 12, 13, 14, 15, 16};
422   const int axis_shape[] = {1, 1};
423   const int32_t axis_data[] = {1};
424   const int output1_shape[] = {4, 2, 1, 2, 2};
425   const uint8_t golden1[] = {1, 2, 3, 4, 9, 10, 11, 12};
426   const int output2_shape[] = {4, 2, 1, 2, 2};
427   const uint8_t golden2[] = {5, 6, 7, 8, 13, 14, 15, 16};
428 
429   constexpr int output1_dims_count = 8;
430   constexpr int output2_dims_count = 8;
431   uint8_t output1_data[output1_dims_count];
432   uint8_t output2_data[output2_dims_count];
433   tflite::testing::TestSplitTwoOutputsQuantized(
434       input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
435       output2_shape, golden2, output1_data, output2_data);
436 }
437 
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalQuantized32)438 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalQuantized32) {
439   const int input_shape[] = {4, 2, 2, 2, 2};
440   const int32_t input_data[] = {1, 2,  3,  4,  5,  6,  7,  8,
441                                 9, 10, 11, 12, 13, 14, 15, 16};
442   const int axis_shape[] = {1, 1};
443   const int32_t axis_data[] = {1};
444   const int output1_shape[] = {4, 2, 1, 2, 2};
445   const int32_t golden1[] = {1, 2, 3, 4, 9, 10, 11, 12};
446   const int output2_shape[] = {4, 2, 1, 2, 2};
447   const int32_t golden2[] = {5, 6, 7, 8, 13, 14, 15, 16};
448 
449   constexpr int output1_dims_count = 8;
450   constexpr int output2_dims_count = 8;
451   int32_t output1_data[output1_dims_count];
452   int32_t output2_data[output2_dims_count];
453   tflite::testing::TestSplitTwoOutputsQuantized32(
454       input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
455       output2_shape, golden2, output1_data, output2_data);
456 }
457 
458 TF_LITE_MICRO_TESTS_END
459