TensorFlow Lite Micro报错REDUCE_PROD算子不支持,如何运行三维输入模型?
问题描述
- 使用Seeed Studio XIAO开发板进行机器学习开发,参考官方XIAO BLE Sense TFLite入门教程
- 示例模型输入尺寸为
[None, time_steps * num_features],对应输入实例为[1, 119 samples * 6 IMU features],对应的.ino文件可正常运行 - 自行训练的模型输入尺寸为
[None, 30(time_steps), 6(num_features)],结构为:输入层(None, 30, 6)→ 2个全连接层 → Flatten层 → 最终全连接层(None, 4) - 将模型转换为
.tflite和.h文件加载到Arduino后,串口输出报错:
20:26:45.976 -> Didn't find op for builtin opcode 'REDUCE_PROD' version '1'. An older version of this builtin might be supported. Are you using an old TFLite binary with a newer model?
20:26:45.976 ->
20:26:45.976 -> Failed to get registration from op code REDUCE_PROD
- 尝试将
Flatten()替换为Reshape()后,仍出现相同报错,询问如何在TensorFlow Lite for Microcontroller应用中运行输入尺寸为[None, time_steps, num_features]的模型
解决方案
1. 解决REDUCE_PROD算子兼容问题
TFLite Micro对算子的版本支持有限,REDUCE_PROD v1可能未被当前开发板使用的TFLite库支持,可尝试两种方式:
- 降级TensorFlow版本:使用和官方教程一致的TensorFlow版本(如2.8或2.9版本)重新训练并转换模型,这类版本的REDUCE_PROD算子版本更低,兼容性更好
- 转换时指定兼容算子集:在模型转换脚本中添加配置,限制使用TFLite原生支持的算子,示例代码:
若必须使用扩展算子,可添加converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]tf.lite.OpsSet.SELECT_TF_OPS,但会增大固件体积,需考虑XIAO的内存限制
2. 调整模型结构适配TFLite Micro
- 扁平化输入提前处理:训练阶段就将输入数据从
(样本数, 30, 6)reshape为(样本数, 180),模型输入层设为[None, 180],后续全连接层直接处理扁平化数据,完全避免用到Flatten/Reshape或REDUCE_PROD算子 - 替换Flatten为兼容算子:若需保留时序结构,使用TFLite Micro支持的
GlobalAveragePooling1D或GlobalMaxPooling1D替代Flatten层,再连接全连接层,这类算子兼容性远高于Flatten/Reshape
3. 更新TFLite Micro库
在Arduino库管理器中找到TensorFlow Lite for Microcontrollers库,更新到最新稳定版,新版库会新增更多算子支持,可能解决REDUCE_PROD的兼容问题
4. 模型转换的关键设置
- 固定输入形状:TFLite Micro不支持动态batch维度(即
None),转换时需指定固定输入形状为[1, 30, 6],示例转换脚本:import tensorflow as tf converter = tf.lite.TFLiteConverter.from_keras_model(your_trained_model) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS] # 指定固定输入形状,替换input_layer为你的模型输入层名称 converter.input_shapes = {'input_layer': [1, 30, 6]} converter.inference_input_type = tf.float32 # 可根据需求改为int8量化 converter.inference_output_type = tf.float32 tflite_model = converter.convert() with open("your_model.tflite", "wb") as f: f.write(tflite_model) - 转换为
.h文件时,使用xxd工具的正确命令:xxd -i your_model.tflite > your_model.h
内容的提问来源于stack exchange,提问作者Yi Zheng
相关产品推荐
相关产品推荐

