如何修复Logits and Labels must have the same shape报错
报错根本原因
你当前的模型架构和数据处理存在两个核心不匹配的问题:
- 输入的单张图像是560*560的二维矩阵,你直接堆叠全连接(Dense)层时,全连接层默认仅对最后一个维度做计算,输出会保留560这个维度,最终输出形状为
(样本数, 560, 2),和标签的(样本数, 1, 1)形状完全不符 - 你需要的是整图二分类,而当前模型输出的是像素级的二分类结果,和任务目标不匹配
修复步骤
步骤1:调整模型架构
如果你坚持用全连接层做分类,需要先把单张图像的二维矩阵展平为一维向量,同时调整输出层适配二分类任务:
from tensorflow.keras.layers import Flatten # 没有导入Flatten的话先加这行 model = Sequential( [ # 新增展平层,把每张图的(560,560)矩阵转为一维向量 Flatten(input_shape=(560,560)), Dense(750, activation='relu'), Dropout(0.2), Dense(750, activation='relu'), Dropout(0.2), # 二分类任务输出1个神经元即可,用sigmoid激活 Dense(1, activation='sigmoid') ] )
如果要提升图像分类效果,更推荐把前两层全连接替换为卷积+池化的组合,避免全连接层参数过多导致严重过拟合。
步骤2:调整标签形状
把标签多余的维度压缩,适配输出层形状:
# 去掉最后两个长度为1的维度,处理后datay形状为(样本数,) datay = np.squeeze(datay)
步骤3:优化训练参数
你当前的损失函数binary_crossentropy和二分类+sigmoid的配置是匹配的,不用修改,建议把初始学习率0.1调小到1e-4~1e-3区间,避免模型不收敛。
内容的提问来源于stack exchange,提问作者Kookies
相关产品推荐
相关产品推荐

