Keras搭建CNN训练猫狗分类报reshape张量尺寸不匹配错误
错误产生原因
这个报错的核心诱因是数据集输出的图像尺寸和模型预设的输入尺寸不匹配,属于配置类错误,和数据集本身、代码逻辑框架无关:
- 你在训练、验证、测试三个数据集加载器中,设置的图像缩放目标尺寸为
(244,244) - 但模型第一层卷积层定义的输入形状
input_shape为(224,224,3) - 模型中两层步长为2的最大池化层,会将输入特征图的宽高各压缩至原尺寸的1/4:
- 如果输入是模型预设的224224尺寸图像,经过两次池化后特征图尺寸为5656,搭配64个卷积通道,单样本展平后的特征长度为
56*56*64=200704,这就是报错信息中提到的要求形状的基准值 - 实际送入模型的是244244的图像,经过两次池化后特征图尺寸为6161,单样本展平长度为
61*61*64=238144,乘以你设置的batch size=10,总元素量正好是报错中提到的2381440,和Flatten层预设的展平长度不匹配,因此触发Reshape节点错误。
- 如果输入是模型预设的224224尺寸图像,经过两次池化后特征图尺寸为5656,搭配64个卷积通道,单样本展平后的特征长度为
修正方案
两种修改方式二选一即可,优先选择第一种,因为你调用了VGG16的预处理函数,VGG16标准输入尺寸就是224*224:
- 方案1:统一数据集输出尺寸,将三个
ImageDataGenerator.flow_from_directory中的target_size参数从(244,244)修改为(224,224),和模型输入尺寸对齐 - 方案2:统一模型输入尺寸,将第一层Conv2D的
input_shape参数从(224,224,3)修改为(244,244,3),和数据集输出尺寸对齐
以方案1为例,修正后的数据集加载代码如下:
train_batch=ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input) \ .flow_from_directory(directory='/content/Cat-vs-Dogs/train',target_size=(224,224),classes=['cats','dogs'],batch_size=10) valid_batch=ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input) \ .flow_from_directory(directory='/content/Cat-vs-Dogs/valid',target_size=(224,224),classes=['cats','dogs'],batch_size=10) test_batch=ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input) \ .flow_from_directory(directory='/content/Cat-vs-Dogs/test',target_size=(224,224),classes=['cats','dogs'],batch_size=10,shuffle=False)
修改完成后重新运行代码即可正常启动训练。
内容的提问来源于stack exchange,提问作者Nikhar Doshi
相关产品推荐
相关产品推荐

