指定输入形状后训练CNN仍报输入形状不匹配错误求助
问题定位与解决方案
核心原因
问题不在模型定义环节,而是训练数据集train_data(及验证集val_data)输出的图片尺寸为(256,256,3),与模型要求的输入尺寸不匹配。你所谓的“确认输入图片尺寸符合要求”大概率是指原始图片尺寸,但数据加载/预处理阶段未执行resize操作,导致实际输入模型的图片仍为原始256尺寸。
具体排查与解决步骤
1. 检查数据集加载逻辑
如果使用ImageDataGenerator加载数据,必须在flow_from_directory或flow方法中明确指定target_size=(150,150):
from tensorflow.keras.preprocessing.image import ImageDataGenerator # 训练集加载 train_datagen = ImageDataGenerator(rescale=1./255) train_data = train_datagen.flow_from_directory( '你的训练集目录路径', target_size=(150, 150), # 强制将图片resize为目标尺寸 batch_size=32, class_mode='categorical' ) # 验证集加载同理 val_datagen = ImageDataGenerator(rescale=1./255) val_data = val_datagen.flow_from_directory( '你的验证集目录路径', target_size=(150, 150), batch_size=32, class_mode='categorical' )
如果是自定义数据集加载代码,需确保读取图片后执行resize操作:
import cv2 # 示例:读取单张图片并调整尺寸 img = cv2.imread('图片路径.jpg') img = cv2.resize(img, (150, 150)) # 必须添加此步骤统一尺寸
2. 验证数据集输出尺寸
训练前先打印数据集的输出形状,确认是否符合要求:
# 获取一个batch的数据查看形状 x_batch, y_batch = next(train_data) print(x_batch.shape) # 正常应输出 (batch_size, 150, 150, 3)
若输出为(batch_size,256,256,3),则可确认是数据集预处理环节的问题。
3. 额外注意事项
- TensorFlow 1.14版本中,模型不会自动对输入数据进行resize,必须手动保证输入数据尺寸与模型
input_shape完全一致; - 使用
ImageDataGenerator的增强操作时,不要覆盖或遗漏target_size参数; - 自定义模型的
input_shape仅为输入规范定义,不具备自动修正输入数据尺寸的能力。
补充:修正后的完整训练流程示例
# 1. 正确加载并预处理数据集 train_datagen = ImageDataGenerator(rescale=1./255) train_data = train_datagen.flow_from_directory( './train_images', target_size=(150,150), batch_size=32, class_mode='categorical' ) val_datagen = ImageDataGenerator(rescale=1./255) val_data = val_datagen.flow_from_directory( './val_images', target_size=(150,150), batch_size=32, class_mode='categorical' ) # 2. 定义并训练MobileNetV2模型 from tensorflow.keras.models import Model base_model=tf.keras.applications.mobilenet_v2.MobileNetV2(include_top=False,weights=None,input_shape=(150,150,3)) x = base_model.output x = tf.keras.layers.GlobalAveragePooling2D()(x) x = tf.keras.layers.Dense(1024, activation='relu')(x) predictions = tf.keras.layers.Dense(9,activation='softmax')(x) model = Model(inputs = base_model.input,outputs=predictions) model.compile(loss='categorical_crossentropy',metrics=["accuracy"],optimizer = tf.keras.optimizers.Adam()) history = model.fit(train_data, epochs=5, steps_per_epoch=len(train_data), validation_data=val_data, validation_steps=len(val_data))
内容的提问来源于stack exchange,提问作者J Song
相关产品推荐
相关产品推荐

