From 49e4a081d59e293366f14011e4d2e239ab77d7e7 Mon Sep 17 00:00:00 2001 From: andresovela Date: Tue, 29 Oct 2024 15:26:41 +0100 Subject: [PATCH 1/3] Add int16 support to PACK --- tensorflow/lite/micro/kernels/pack.cc | 4 ++ tensorflow/lite/micro/kernels/pack_test.cc | 66 ++++++++-------------- 2 files changed, 28 insertions(+), 42 deletions(-) diff --git a/tensorflow/lite/micro/kernels/pack.cc b/tensorflow/lite/micro/kernels/pack.cc index f254329e889..21158936572 100644 --- a/tensorflow/lite/micro/kernels/pack.cc +++ b/tensorflow/lite/micro/kernels/pack.cc @@ -85,6 +85,10 @@ TfLiteStatus PackEval(TfLiteContext* context, TfLiteNode* node) { return PackImpl(context, node, output, data->values_count, data->axis); } + case kTfLiteInt16: { + return PackImpl(context, node, output, data->values_count, + data->axis); + } case kTfLiteInt32: { return PackImpl(context, node, output, data->values_count, data->axis); diff --git a/tensorflow/lite/micro/kernels/pack_test.cc b/tensorflow/lite/micro/kernels/pack_test.cc index 09422176f9f..6deba5c1b4a 100644 --- a/tensorflow/lite/micro/kernels/pack_test.cc +++ b/tensorflow/lite/micro/kernels/pack_test.cc @@ -110,44 +110,11 @@ void TestPackThreeInputsFloat(int* input1_dims_data, const float* input1_data, 1e-5f, output_data); } +template void TestPackTwoInputsQuantized( - int* input1_dims_data, const int8_t* input1_data, int* input2_dims_data, - const int8_t* input2_data, int axis, int* output_dims_data, - const int8_t* expected_output_data, int8_t* output_data) { - TfLiteIntArray* input1_dims = IntArrayFromInts(input1_dims_data); - TfLiteIntArray* input2_dims = IntArrayFromInts(input2_dims_data); - TfLiteIntArray* output_dims = IntArrayFromInts(output_dims_data); - const int output_dims_count = ElementCount(*output_dims); - - constexpr int input_size = 2; - constexpr int output_size = 1; - constexpr int tensors_size = input_size + output_size; - TfLiteTensor tensors[tensors_size] = { - // CreateQuantizedTensor needs scale/zero_point values as input, but these - // values don't matter as to the functionality of PACK, so just set as 1.0 - // and 128. - CreateQuantizedTensor(input1_data, input1_dims, 1.0, 128), - CreateQuantizedTensor(input2_data, input2_dims, 1.0, 128), - CreateQuantizedTensor(output_data, output_dims, 1.0, 128)}; - - TfLitePackParams builtin_data = { - .values_count = 2, - .axis = axis, - }; - int inputs_array_data[] = {2, 0, 1}; - TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data); - int outputs_array_data[] = {1, 2}; - TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data); - - ValidatePackGoldens(tensors, tensors_size, builtin_data, inputs_array, - outputs_array, expected_output_data, output_dims_count, - 1e-5f, output_data); -} - -void TestPackTwoInputsQuantized32( - int* input1_dims_data, const int32_t* input1_data, int* input2_dims_data, - const int32_t* input2_data, int axis, int* output_dims_data, - const int32_t* expected_output_data, int32_t* output_data) { + int* input1_dims_data, const T* input1_data, int* input2_dims_data, + const T* input2_data, int axis, int* output_dims_data, + const T* expected_output_data, T* output_data) { TfLiteIntArray* input1_dims = IntArrayFromInts(input1_dims_data); TfLiteIntArray* input2_dims = IntArrayFromInts(input2_dims_data); TfLiteIntArray* output_dims = IntArrayFromInts(output_dims_data); @@ -227,7 +194,7 @@ TF_LITE_MICRO_TEST(PackFloatThreeInputsNegativeAxis) { input3_values, axis, output_shape, golden, output_data); } -TF_LITE_MICRO_TEST(PackFloatMultilDimensions) { +TF_LITE_MICRO_TEST(PackFloatMultiDimensions) { int input_shape[] = {2, 2, 3}; int output_shape[] = {3, 2, 2, 3}; const float input1_values[] = {1, 2, 3, 4, 5, 6}; @@ -242,7 +209,7 @@ TF_LITE_MICRO_TEST(PackFloatMultilDimensions) { output_shape, golden, output_data); } -TF_LITE_MICRO_TEST(PackQuantizedMultilDimensions) { +TF_LITE_MICRO_TEST(PackQuantizedInt8MultiDimensions) { int input_shape[] = {2, 2, 3}; int output_shape[] = {3, 2, 2, 3}; const int8_t input1_values[] = {1, 2, 3, 4, 5, 6}; @@ -252,12 +219,27 @@ TF_LITE_MICRO_TEST(PackQuantizedMultilDimensions) { constexpr int output_dims_count = 12; int8_t output_data[output_dims_count]; - tflite::testing::TestPackTwoInputsQuantized( + tflite::testing::TestPackTwoInputsQuantized( + input_shape, input1_values, input_shape, input2_values, axis, + output_shape, golden, output_data); +} + +TF_LITE_MICRO_TEST(PackQuantizedInt16MultiDimensions) { + int input_shape[] = {2, 2, 3}; + int output_shape[] = {3, 2, 2, 3}; + const int16_t input1_values[] = {1, 2, 3, 4, 5, 6}; + const int16_t input2_values[] = {7, 8, 9, 10, 11, 12}; + const int16_t golden[] = {1, 2, 3, 7, 8, 9, 4, 5, 6, 10, 11, 12}; + const int axis = 1; + constexpr int output_dims_count = 12; + int16_t output_data[output_dims_count]; + + tflite::testing::TestPackTwoInputsQuantized( input_shape, input1_values, input_shape, input2_values, axis, output_shape, golden, output_data); } -TF_LITE_MICRO_TEST(PackQuantized32MultilDimensions) { +TF_LITE_MICRO_TEST(PackQuantizedInt32MultiDimensions) { int input_shape[] = {2, 2, 3}; int output_shape[] = {3, 2, 2, 3}; const int32_t input1_values[] = {1, 2, 3, 4, 5, 6}; @@ -267,7 +249,7 @@ TF_LITE_MICRO_TEST(PackQuantized32MultilDimensions) { constexpr int output_dims_count = 12; int32_t output_data[output_dims_count]; - tflite::testing::TestPackTwoInputsQuantized32( + tflite::testing::TestPackTwoInputsQuantized( input_shape, input1_values, input_shape, input2_values, axis, output_shape, golden, output_data); } From 8052aa223b76e16f7d25fd733e2234e044fcec56 Mon Sep 17 00:00:00 2001 From: andresovela Date: Tue, 29 Oct 2024 15:26:51 +0100 Subject: [PATCH 2/3] Add int16 support to UNPACK --- tensorflow/lite/micro/kernels/unpack.cc | 3 ++ tensorflow/lite/micro/kernels/unpack_test.cc | 38 +++++++++++++++----- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/tensorflow/lite/micro/kernels/unpack.cc b/tensorflow/lite/micro/kernels/unpack.cc index 9ce168384a4..982349534ca 100644 --- a/tensorflow/lite/micro/kernels/unpack.cc +++ b/tensorflow/lite/micro/kernels/unpack.cc @@ -86,6 +86,9 @@ TfLiteStatus UnpackEval(TfLiteContext* context, TfLiteNode* node) { case kTfLiteInt32: { return UnpackImpl(context, node, input, data->num, data->axis); } + case kTfLiteInt16: { + return UnpackImpl(context, node, input, data->num, data->axis); + } case kTfLiteInt8: { return UnpackImpl(context, node, input, data->num, data->axis); } diff --git a/tensorflow/lite/micro/kernels/unpack_test.cc b/tensorflow/lite/micro/kernels/unpack_test.cc index 2e16822ad3e..11fe7c363d7 100644 --- a/tensorflow/lite/micro/kernels/unpack_test.cc +++ b/tensorflow/lite/micro/kernels/unpack_test.cc @@ -132,12 +132,13 @@ void TestUnpackOneOutputFloat(int* input_dims_data, const float* input_data, } } -void TestUnpackThreeOutputsQuantized32( - int* input_dims_data, const int32_t* input_data, int axis, - int* output1_dims_data, const int32_t* expected_output1_data, - int* output2_dims_data, const int32_t* expected_output2_data, - int* output3_dims_data, const int32_t* expected_output3_data, - int32_t* output1_data, int32_t* output2_data, int32_t* output3_data) { +template +void TestUnpackThreeOutputsQuantized( + int* input_dims_data, const T* input_data, int axis, + int* output1_dims_data, const T* expected_output1_data, + int* output2_dims_data, const T* expected_output2_data, + int* output3_dims_data, const T* expected_output3_data, + T* output1_data, T* output2_data, T* output3_data) { TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data); TfLiteIntArray* output1_dims = IntArrayFromInts(output1_dims_data); TfLiteIntArray* output2_dims = IntArrayFromInts(output2_dims_data); @@ -257,7 +258,28 @@ TF_LITE_MICRO_TEST(UnpackFloatOneOutput) { output_shape, golden, output_data); } -TF_LITE_MICRO_TEST(UnpackQuantized32ThreeOutputs) { +TF_LITE_MICRO_TEST(UnpackQuantizedInt16ThreeOutputs) { + int input_shape[] = {2, 3, 2}; + const int16_t input_values[] = {1, 2, 3, 4, 5, 6}; + int output1_shape[] = {1, 2}; + const int16_t output1_golden[] = {1, 2}; + int output2_shape[] = {1, 2}; + const int16_t output2_golden[] = {3, 4}; + int output3_shape[] = {1, 2}; + const int16_t output3_golden[] = {5, 6}; + constexpr int output1_dims_count = 2; + constexpr int output2_dims_count = 2; + constexpr int output3_dims_count = 2; + int16_t output1_data[output1_dims_count]; + int16_t output2_data[output2_dims_count]; + int16_t output3_data[output3_dims_count]; + tflite::testing::TestUnpackThreeOutputsQuantized( + input_shape, input_values, 0, output1_shape, output1_golden, + output2_shape, output2_golden, output3_shape, output3_golden, + output1_data, output2_data, output3_data); +} + +TF_LITE_MICRO_TEST(UnpackQuantizedInt32ThreeOutputs) { int input_shape[] = {2, 3, 2}; const int32_t input_values[] = {1, 2, 3, 4, 5, 6}; int output1_shape[] = {1, 2}; @@ -272,7 +294,7 @@ TF_LITE_MICRO_TEST(UnpackQuantized32ThreeOutputs) { int32_t output1_data[output1_dims_count]; int32_t output2_data[output2_dims_count]; int32_t output3_data[output3_dims_count]; - tflite::testing::TestUnpackThreeOutputsQuantized32( + tflite::testing::TestUnpackThreeOutputsQuantized( input_shape, input_values, 0, output1_shape, output1_golden, output2_shape, output2_golden, output3_shape, output3_golden, output1_data, output2_data, output3_data); From 877e0f0ab32b0e41c539b2cae5848128beee6d8c Mon Sep 17 00:00:00 2001 From: andresovela Date: Tue, 29 Oct 2024 15:28:39 +0100 Subject: [PATCH 3/3] Fix formatting --- tensorflow/lite/micro/kernels/pack.cc | 2 +- tensorflow/lite/micro/kernels/pack_test.cc | 10 +++++----- tensorflow/lite/micro/kernels/unpack_test.cc | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tensorflow/lite/micro/kernels/pack.cc b/tensorflow/lite/micro/kernels/pack.cc index 21158936572..413cb4eafbb 100644 --- a/tensorflow/lite/micro/kernels/pack.cc +++ b/tensorflow/lite/micro/kernels/pack.cc @@ -87,7 +87,7 @@ TfLiteStatus PackEval(TfLiteContext* context, TfLiteNode* node) { } case kTfLiteInt16: { return PackImpl(context, node, output, data->values_count, - data->axis); + data->axis); } case kTfLiteInt32: { return PackImpl(context, node, output, data->values_count, diff --git a/tensorflow/lite/micro/kernels/pack_test.cc b/tensorflow/lite/micro/kernels/pack_test.cc index 6deba5c1b4a..89b376ae4ea 100644 --- a/tensorflow/lite/micro/kernels/pack_test.cc +++ b/tensorflow/lite/micro/kernels/pack_test.cc @@ -110,11 +110,11 @@ void TestPackThreeInputsFloat(int* input1_dims_data, const float* input1_data, 1e-5f, output_data); } -template -void TestPackTwoInputsQuantized( - int* input1_dims_data, const T* input1_data, int* input2_dims_data, - const T* input2_data, int axis, int* output_dims_data, - const T* expected_output_data, T* output_data) { +template +void TestPackTwoInputsQuantized(int* input1_dims_data, const T* input1_data, + int* input2_dims_data, const T* input2_data, + int axis, int* output_dims_data, + const T* expected_output_data, T* output_data) { TfLiteIntArray* input1_dims = IntArrayFromInts(input1_dims_data); TfLiteIntArray* input2_dims = IntArrayFromInts(input2_dims_data); TfLiteIntArray* output_dims = IntArrayFromInts(output_dims_data); diff --git a/tensorflow/lite/micro/kernels/unpack_test.cc b/tensorflow/lite/micro/kernels/unpack_test.cc index 11fe7c363d7..d7ddb3a0ab4 100644 --- a/tensorflow/lite/micro/kernels/unpack_test.cc +++ b/tensorflow/lite/micro/kernels/unpack_test.cc @@ -132,13 +132,13 @@ void TestUnpackOneOutputFloat(int* input_dims_data, const float* input_data, } } -template +template void TestUnpackThreeOutputsQuantized( - int* input_dims_data, const T* input_data, int axis, - int* output1_dims_data, const T* expected_output1_data, - int* output2_dims_data, const T* expected_output2_data, - int* output3_dims_data, const T* expected_output3_data, - T* output1_data, T* output2_data, T* output3_data) { + int* input_dims_data, const T* input_data, int axis, int* output1_dims_data, + const T* expected_output1_data, int* output2_dims_data, + const T* expected_output2_data, int* output3_dims_data, + const T* expected_output3_data, T* output1_data, T* output2_data, + T* output3_data) { TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data); TfLiteIntArray* output1_dims = IntArrayFromInts(output1_dims_data); TfLiteIntArray* output2_dims = IntArrayFromInts(output2_dims_data);