TensorFlow猫狗分类CNN训练reshape形状不匹配错误求解
问题排查与解决方案
错误根因
你代码的核心问题是模型定义的输入尺寸和数据生成器输出的图片尺寸不匹配,两部分配置冲突:
- 模型第一层
Conv2D指定的input_shape=(300,300,3),要求输入为300*300分辨率的3通道图片 - 训练和验证的
ImageDataGenerator中设置的target_size=(150,150),会把所有数据集图片统一缩放为150*150分辨率
两者分辨率差一倍,经过三次卷积池化后输出的特征图大小和Flatten层预期的输入大小不匹配,就会触发reshape维度错误。
修复方案
二选一即可,保证模型输入尺寸和数据生成器输出尺寸统一:
方案1:修改数据生成器配置(适配300*300输入)
将两个数据生成器的target_size修改为300*300:
train_generator = train_datagen.flow_from_directory( 'training_set', target_size=(300,300), batch_size=456, class_mode='binary' ) validation_generator = validation_datagen.flow_from_directory( 'test_set', target_size=(300,300), batch_size=456, class_mode='binary' )
注意:该方案输入图片分辨率更高,显存占用更大,若你的设备显存不足会触发OOM错误,优先选择方案2。
方案2:修改模型输入配置(适配150*150输入)
将模型第一层Conv2D的input_shape修改为(150,150,3):
model = tf.keras.Sequential([ tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150,150,3)), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(32, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(64, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ])
该方案输入分辨率更低,训练速度更快,对显存要求更低,更推荐使用。
内容的提问来源于stack exchange,提问作者Robo
相关产品推荐
相关产品推荐

