TFLite模型int8量化报Invalid input shapes: expected 1 items got 16 items如何解决
错误原因
这个报错本质是代表数据集的返回格式不符合TFLite转换器的要求:
- TFLite整数量化要求
representative_dataset生成器每次yield的是模型输入的列表/元组,就算你的模型只有1个输入,也需要用列表或单元素元组包裹 - 你代码中写的
yield (image_batch)没有加逗号,等价于直接返回shape为(16, 高, 宽, 通道数)的批次张量,转换器会把张量的第一个维度(batch size=16)识别为输入的数量,和你模型仅1个输入的结构冲突,因此抛出expected 1 items got 16 items的错误。
解决方案
修改representative_dataset函数的返回逻辑即可,提供两种可选改法:
改法1:保持批次输入,修正返回格式
仅需要给返回值加一层列表包裹,或者加逗号变成单元素元组:
def representative_dataset(): for image_batch, labels_batch in val_ds: # 用列表包裹单个输入 yield [image_batch] # 或者用带逗号的元组:yield (image_batch,)
改法2:拆为单样本返回(更适配ESP32部署场景)
ESP32部署时一般是单张图片推理,拆成单样本校准更贴合实际运行场景,也能避免部分旧版本TFLite对批次校准的兼容问题:
def representative_dataset(): for image_batch, labels_batch in val_ds: # 迭代批次内的单张图片 for single_img in image_batch: # 给单张图补充batch维度,再用列表包裹输入 yield [tf.expand_dims(single_img, axis=0)]
注意事项
你之前遇到的EndVector() takes 1 positional argument but 2 were given报错本质也是返回格式异常导致的偶发问题,修改返回格式后不需要重启内核也不会复现。
修改完成后重新执行转换逻辑,即可正常生成int8量化的TFLite模型,后续可以直接转为C头文件用于ESP32的TFLite Micro部署。
内容的提问来源于stack exchange,提问作者Pruthvi B.
相关产品推荐
相关产品推荐

