树莓派运行Google Teachable Machine TF JS模型遇uint8输入错误求助
解决思路
1. 验证模型输入数据类型
先确认你的Edge TPU模型输入类型是否为uint8,用tflite-cli工具查看:
tflite-cli info --model=你的模型文件名_edgetpu.tflite
查看输出中的Input types字段,如果显示不是uint8,说明模型量化类型不符合要求,需要重新转换。
2. 重新量化并编译模型
Teachable Machine导出的模型默认多为float32格式,转Edge TPU时必须指定uint8量化,且需提供代表性数据集做校准:
在Colab的转换代码中补充量化配置:
import tensorflow as tf # 加载你的原始模型 model = tf.keras.models.load_model('你的原始模型.h5') converter = tf.lite.TFLiteConverter.from_keras_model(model) # 开启优化 converter.optimizations = [tf.lite.Optimize.DEFAULT] # 指定目标类型为uint8 converter.target_spec.supported_types = [tf.uint8] # 定义代表性数据集(用你的训练数据子集生成,确保覆盖数据分布) def representative_dataset_gen(): for _ in range(100): # 生成符合模型输入形状的随机数据,或用真实训练样本 yield [tf.random.normal([1, 224, 224, 3])] converter.representative_dataset = representative_dataset_gen # 转换为TFLite模型 tflite_model = converter.convert() with open('quantized_model.tflite', 'wb') as f: f.write(tflite_model)
之后用Edge TPU编译器重新编译这个量化后的模型:
edgetpu_compiler quantized_model.tflite
3. 适配脚本的输入预处理逻辑
如果模型已经是uint8输入,检查classify_image.py的图像预处理步骤:
- 确保图像加载后直接转换为uint8格式,不要做归一化到[0,1]的float32处理。比如修改脚本中的输入处理部分:
# 替换原归一化代码(若存在) # input_data = (input_data - mean) / std # 改为直接转为uint8 input_data = input_data.astype(np.uint8)
4. 排查编译警告
用edgetpu_compiler编译时,如果出现输入类型相关警告,说明模型仍不符合Edge TPU要求,需回到量化步骤调整,确保所有输入输出均为uint8类型。
内容的提问来源于stack exchange,提问作者mongoq
相关产品推荐
相关产品推荐

