Keras搭建猫狗分类CNN时报Incompatible shapes形状不兼容错误如何解决
错误原因
你遇到的形状不匹配报错核心来自两个问题:
- 卷积、池化层输出的是
(批次大小, 高度, 宽度, 通道数)的四维张量,你没有对空间维度做压缩就直接接入全连接层,导致最终模型输出形状为(29,7,7,2),和数据集返回的(29,)一维标签形状完全不匹配。 - 损失函数、输出层配置和数据集标签格式三者不匹配:
image_dataset_from_directory默认返回的是0/1格式的整数标签,你当前用2个输出神经元配二分类交叉熵的逻辑本身也不对应。
修复方案
1. 调整模型结构,增加空间维度压缩层
你已经导入了GlobalMaxPooling2D,在接入全连接层前调用该层,将四维张量压缩为(批次大小, 特征数)的二维张量:
model = Sequential() model.add(keras.Input(shape=(150, 150, 3))) model.add(Conv2D(32, 5, strides=2, activation="relu")) model.add(Conv2D(32, 3, activation="relu")) model.add(MaxPooling2D(3)) # 新增全局池化层,压缩高、宽维度 model.add(GlobalMaxPooling2D()) model.add(Dense(250, activation='relu')) model.add(Dense(100, activation='relu')) # 二分类任务用1个输出神经元+sigmoid激活更适配 model.add(Dense(1, activation='sigmoid')) model.summary()
额外说明:如果你的实际数据集确实是15×15尺寸,需要把image_dataset_from_directory里的image_size参数改成(15,15),否则代码会把图片强行拉伸到150×150,影响训练效果
2. 调整损失函数配置
和1个输出+sigmoid的结构对应,编译时损失函数按如下配置即可:
model.compile(loss=tf.keras.losses.BinaryCrossentropy(), optimizer='adam', metrics=['accuracy'])
内容的提问来源于stack exchange,提问作者Daniil G
相关产品推荐
相关产品推荐

