Skip to content

Commit 5c6def1

Browse files
Tflite min max missing datatypes support (#38) (#72)
-Adds bf16,f16 for tflite min max operations -Adds bf16,f16 min max unit tests
1 parent 458c6a4 commit 5c6def1

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed

tensorflow/lite/kernels/maximum_minimum.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ limitations under the License.
1616

1717
#include <stdint.h>
1818

19+
#include "Eigen/Core"
1920
#include "tensorflow/lite/core/c/common.h"
2021
#include "tensorflow/lite/kernels/internal/compatibility.h"
2122
#include "tensorflow/lite/kernels/internal/optimized/optimized_ops.h"
@@ -244,6 +245,14 @@ TfLiteStatus Eval(TfLiteContext* context, TfLiteNode* node) {
244245
case kTfLiteInt16:
245246
TFLiteOperation<kernel_type, int16_t, OpType>(context, node, op_context);
246247
break;
248+
case kTfLiteFloat16:
249+
TFLiteOperation<kernel_type, Eigen::half, OpType>(context, node,
250+
op_context);
251+
break;
252+
case kTfLiteBFloat16:
253+
TFLiteOperation<kernel_type, Eigen::bfloat16, OpType>(context, node,
254+
op_context);
255+
break;
247256
default:
248257
TF_LITE_KERNEL_LOG(context,
249258
"Type %d is currently not supported by Maximum.",

tensorflow/lite/kernels/maximum_minimum_test.cc

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ limitations under the License.
2020

2121
#include <gmock/gmock.h>
2222
#include <gtest/gtest.h>
23+
#include "Eigen/Core"
2324
#include "tensorflow/lite/kernels/test_util.h"
2425
#include "tensorflow/lite/schema/schema_generated.h"
2526

@@ -240,5 +241,126 @@ TEST(MaximumOpTest, Int32WithBroadcastTest5D) {
240241
{TensorType_INT32, {1}}, {TensorType_INT32, {3, 1, 2, 1, 1}}, data1,
241242
data2, {1, 0, -1, -2, 2, 2});
242243
}
244+
245+
TEST(MaximumOpTest, Float16Test) {
246+
std::initializer_list<Eigen::half> data1 = {
247+
Eigen::half(1.0), Eigen::half(0.0), Eigen::half(-1.0),
248+
Eigen::half(11.0), Eigen::half(-2.0), Eigen::half(-1.44)};
249+
std::initializer_list<Eigen::half> data2 = {
250+
Eigen::half(-1.0), Eigen::half(0.0), Eigen::half(1.0),
251+
Eigen::half(12.0), Eigen::half(-3.0), Eigen::half(-1.43)};
252+
TestModel<Eigen::half>(
253+
BuiltinOperator_MAXIMUM, {TensorType_FLOAT16, {3, 1, 2}},
254+
{TensorType_FLOAT16, {3, 1, 2}}, {TensorType_FLOAT16, {3, 1, 2}}, data1,
255+
data2,
256+
{Eigen::half(1.0), Eigen::half(0.0), Eigen::half(1.0), Eigen::half(12.0),
257+
Eigen::half(-2.0), Eigen::half(-1.43)});
258+
TestModel<Eigen::half>(
259+
BuiltinOperator_MINIMUM, {TensorType_FLOAT16, {3, 1, 2}},
260+
{TensorType_FLOAT16, {3, 1, 2}}, {TensorType_FLOAT16, {3, 1, 2}}, data1,
261+
data2,
262+
{Eigen::half(-1.0), Eigen::half(0.0), Eigen::half(-1.0),
263+
Eigen::half(11.0), Eigen::half(-3.0), Eigen::half(-1.44)});
264+
}
265+
266+
TEST(MaximumOpTest, BFloat16Test) {
267+
std::initializer_list<Eigen::bfloat16> data1 = {
268+
Eigen::bfloat16(1.0), Eigen::bfloat16(0.0), Eigen::bfloat16(-1.0),
269+
Eigen::bfloat16(11.0), Eigen::bfloat16(-2.0), Eigen::bfloat16(-1.44)};
270+
std::initializer_list<Eigen::bfloat16> data2 = {
271+
Eigen::bfloat16(-1.0), Eigen::bfloat16(0.0), Eigen::bfloat16(1.0),
272+
Eigen::bfloat16(12.0), Eigen::bfloat16(-3.0), Eigen::bfloat16(-1.43)};
273+
TestModel<Eigen::bfloat16>(
274+
BuiltinOperator_MAXIMUM, {TensorType_BFLOAT16, {3, 1, 2}},
275+
{TensorType_BFLOAT16, {3, 1, 2}}, {TensorType_BFLOAT16, {3, 1, 2}}, data1,
276+
data2,
277+
{Eigen::bfloat16(1.0), Eigen::bfloat16(0.0), Eigen::bfloat16(1.0),
278+
Eigen::bfloat16(12.0), Eigen::bfloat16(-2.0), Eigen::bfloat16(-1.43)});
279+
TestModel<Eigen::bfloat16>(
280+
BuiltinOperator_MINIMUM, {TensorType_BFLOAT16, {3, 1, 2}},
281+
{TensorType_BFLOAT16, {3, 1, 2}}, {TensorType_BFLOAT16, {3, 1, 2}}, data1,
282+
data2,
283+
{Eigen::bfloat16(-1.0), Eigen::bfloat16(0.0), Eigen::bfloat16(-1.0),
284+
Eigen::bfloat16(11.0), Eigen::bfloat16(-3.0), Eigen::bfloat16(-1.44)});
285+
}
286+
287+
TEST(MaximumOpTest, BFloat16WithBroadcastTest5DScalarY) {
288+
std::initializer_list<Eigen::bfloat16> data1 = {
289+
Eigen::bfloat16(1.0), Eigen::bfloat16(0.0), Eigen::bfloat16(-1.0),
290+
Eigen::bfloat16(-2.0), Eigen::bfloat16(3.0), Eigen::bfloat16(11.0)};
291+
std::initializer_list<Eigen::bfloat16> data2 = {Eigen::bfloat16(2.0)};
292+
TestModel<Eigen::bfloat16>(
293+
BuiltinOperator_MAXIMUM, {TensorType_BFLOAT16, {3, 1, 2, 1, 1}},
294+
{TensorType_BFLOAT16, {1}}, {TensorType_BFLOAT16, {3, 1, 2, 1, 1}}, data1,
295+
data2,
296+
{Eigen::bfloat16(2.0), Eigen::bfloat16(2.0), Eigen::bfloat16(2.0),
297+
Eigen::bfloat16(2.0), Eigen::bfloat16(3.0), Eigen::bfloat16(11.0)});
298+
TestModel<Eigen::bfloat16>(
299+
BuiltinOperator_MINIMUM, {TensorType_BFLOAT16, {3, 1, 2, 1, 1}},
300+
{TensorType_BFLOAT16, {1}}, {TensorType_BFLOAT16, {3, 1, 2, 1, 1}}, data1,
301+
data2,
302+
{Eigen::bfloat16(1.0), Eigen::bfloat16(0.0), Eigen::bfloat16(-1.0),
303+
Eigen::bfloat16(-2.0), Eigen::bfloat16(2.0), Eigen::bfloat16(2.0)});
304+
}
305+
306+
TEST(MaximumOpTest, Float16WithBroadcastTest5DScalarY) {
307+
std::initializer_list<Eigen::half> data1 = {
308+
Eigen::half(1.0), Eigen::half(0.0), Eigen::half(-1.0),
309+
Eigen::half(-2.0), Eigen::half(3.0), Eigen::half(11.0)};
310+
std::initializer_list<Eigen::half> data2 = {Eigen::half(2.0)};
311+
TestModel<Eigen::half>(
312+
BuiltinOperator_MAXIMUM, {TensorType_FLOAT16, {3, 1, 2, 1, 1}},
313+
{TensorType_FLOAT16, {1}}, {TensorType_FLOAT16, {3, 1, 2, 1, 1}}, data1,
314+
data2,
315+
{Eigen::half(2.0), Eigen::half(2.0), Eigen::half(2.0), Eigen::half(2.0),
316+
Eigen::half(3.0), Eigen::half(11.0)});
317+
TestModel<Eigen::half>(
318+
BuiltinOperator_MINIMUM, {TensorType_FLOAT16, {3, 1, 2, 1, 1}},
319+
{TensorType_FLOAT16, {1}}, {TensorType_FLOAT16, {3, 1, 2, 1, 1}}, data1,
320+
data2,
321+
{Eigen::half(1.0), Eigen::half(0.0), Eigen::half(-1.0), Eigen::half(-2.0),
322+
Eigen::half(2.0), Eigen::half(2.0)});
323+
}
324+
325+
TEST(MaximumOpTest, Float16WithBroadcastTest5D) {
326+
std::initializer_list<Eigen::half> data1 = {
327+
Eigen::half(1.0), Eigen::half(0.0), Eigen::half(-1.0),
328+
Eigen::half(-2.0), Eigen::half(-1.44), Eigen::half(11.0)};
329+
std::initializer_list<Eigen::half> data2 = {Eigen::half(0.5),
330+
Eigen::half(2.0)};
331+
TestModel<Eigen::half>(
332+
BuiltinOperator_MAXIMUM, {TensorType_FLOAT16, {3, 1, 1, 1, 2}},
333+
{TensorType_FLOAT16, {2}}, {TensorType_FLOAT16, {3, 1, 1, 1, 2}}, data1,
334+
data2,
335+
{Eigen::half(1.0), Eigen::half(2.0), Eigen::half(0.5), Eigen::half(2.0),
336+
Eigen::half(0.5), Eigen::half(11.0)});
337+
TestModel<Eigen::half>(
338+
BuiltinOperator_MINIMUM, {TensorType_FLOAT16, {3, 1, 1, 1, 2}},
339+
{TensorType_FLOAT16, {2}}, {TensorType_FLOAT16, {3, 1, 1, 1, 2}}, data1,
340+
data2,
341+
{Eigen::half(0.5), Eigen::half(0.0), Eigen::half(-1.0), Eigen::half(-2.0),
342+
Eigen::half(-1.44), Eigen::half(2.0)});
343+
}
344+
345+
TEST(MaximumOpTest, BFloat16WithBroadcastTest5D) {
346+
std::initializer_list<Eigen::bfloat16> data1 = {
347+
Eigen::bfloat16(1.0), Eigen::bfloat16(0.0), Eigen::bfloat16(-1.0),
348+
Eigen::bfloat16(-2.0), Eigen::bfloat16(-1.44), Eigen::bfloat16(11.0)};
349+
std::initializer_list<Eigen::bfloat16> data2 = {Eigen::bfloat16(0.5),
350+
Eigen::bfloat16(2.0)};
351+
TestModel<Eigen::bfloat16>(
352+
BuiltinOperator_MAXIMUM, {TensorType_BFLOAT16, {3, 1, 1, 1, 2}},
353+
{TensorType_BFLOAT16, {2}}, {TensorType_BFLOAT16, {3, 1, 1, 1, 2}}, data1,
354+
data2,
355+
{Eigen::bfloat16(1.0), Eigen::bfloat16(2.0), Eigen::bfloat16(0.5),
356+
Eigen::bfloat16(2.0), Eigen::bfloat16(0.5), Eigen::bfloat16(11.0)});
357+
TestModel<Eigen::bfloat16>(
358+
BuiltinOperator_MINIMUM, {TensorType_BFLOAT16, {3, 1, 1, 1, 2}},
359+
{TensorType_BFLOAT16, {2}}, {TensorType_BFLOAT16, {3, 1, 1, 1, 2}}, data1,
360+
data2,
361+
{Eigen::bfloat16(0.5), Eigen::bfloat16(0.0), Eigen::bfloat16(-1.0),
362+
Eigen::bfloat16(-2.0), Eigen::bfloat16(-1.44), Eigen::bfloat16(2.0)});
363+
}
364+
243365
} // namespace
244366
} // namespace tflite

0 commit comments

Comments
 (0)