You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras搭建猫狗分类CNN时报Incompatible shapes形状不兼容错误如何解决

错误原因

你遇到的形状不匹配报错核心来自两个问题:

  1. 卷积、池化层输出的是(批次大小, 高度, 宽度, 通道数)的四维张量,你没有对空间维度做压缩就直接接入全连接层,导致最终模型输出形状为(29,7,7,2),和数据集返回的(29,)一维标签形状完全不匹配。
  2. 损失函数、输出层配置和数据集标签格式三者不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:54:09