TFF 0.18调用ResNet50时出现输入shape不兼容报错如何解决
错误成因
- 数据集读取参数配置错误:给
flow_from_directory设置了class_mode=None,该参数会让生成器只返回图像批次,不返回标签。你用images, labels = next(...)接收返回值时,会把形状为(2, 180, 180, 3)的2张图批次拆分成两个形状为(180, 180, 3)的单张图,分别赋值给images和labels,最终构造的sample_batch完全不存在标签,且两个元素都丢失了batch维度。 - Keras模型输入规则不匹配:你定义的ResNet50输入形状为
(180, 180, 3),Keras会自动在最前面补充batch维度,要求实际输入的形状为(batch_size, 180, 180, 3),而你生成的输入spec没有batch维度,所以触发形状不匹配报错。
解决方法
- 优先修复数据集读取逻辑,去掉
class_mode=None参数,根据你的标签类型指定对应的class_mode(分类任务常用sparse对应整数标签、categorical对应独热编码标签),正确拿到带batch维度的图像和标签批次:
# 示例使用sparse类型标签,可根据实际场景调整class_mode取值 data_gen = img_gen.flow_from_directory(path0, target_size=(180, 180), batch_size = 2, class_mode='sparse') images, labels = next(data_gen) # 此时images形状应为(2, 180, 180, 3),labels形状为(2,),均携带batch维度 sample_batch = (images, labels) input_spec = tf.nest.map_structure(tensor_spec_from_ndarray, sample_batch)
- 若有特殊场景需要处理单样本输入,可手动给样本添加batch维度后再生成input_spec:
# 给单样本的第0位添加batch维度 sample_batch = (tf.expand_dims(images, 0), tf.expand_dims(labels, 0)) input_spec = tf.nest.map_structure(tensor_spec_from_ndarray, sample_batch)
- 修复后验证input_spec结构,正常输出应如下所示,第一个维度为batch维度:
(TensorSpec(shape=(2, 180, 180, 3), dtype=tf.float32, name=None), TensorSpec(shape=(2,), dtype=tf.int32, name=None))
内容的提问来源于stack exchange,提问作者seni
相关产品推荐
相关产品推荐

