运行图像分割模型时出现Logits与Labels形状不匹配错误求助
问题:语义分割训练时logits与labels形状不匹配错误
运行代码
model = sm.Unet('resnet50', encoder_weights='imagenet', classes=n_classes, activation=activation) model.compile(optimizer=Adam(learning_rate = 1e-3), loss='binary_crossentropy', metrics=['accuracy']) model.summary() history = model.fit(X_test, y_test, batch_size = 1, verbose=1, epochs=5, validation_data=(y_test, y_test), shuffle=True)
报错信息
ValueError: `logits` and `labels` must have the same shape, received ((1, 64, 64, 4) vs (1, 64, 64, 1)).
已知数据形状
- X_train:
(113, 64, 64, 3) - y_train:
(133, 64, 64, 1)
问题分析与解决方案
1. 模型输出通道与标签通道不匹配
错误提示显示模型输出为(1,64,64,4),但标签是(1,64,64,1),说明你设置的n_classes=4,但实际标签是单通道的二分类格式(仅包含0/1两类):
- 若为二分类语义分割,将
n_classes改为1,同时激活函数设为sigmoid(与binary_crossentropy损失匹配)。 - 若为4分类任务,需将标签转换为4通道的one-hot编码格式,同时损失函数改用
categorical_crossentropy。
2. 验证集参数设置错误
validation_data的格式应为(验证集输入数据, 验证集标签),你写成(y_test, y_test)会把标签当作模型输入(输入需要3通道,标签仅1通道,形状不匹配),应改为(X_val, y_val)(替换为你的验证集输入和标签)。
3. 训练数据集样本数量不一致
X_train样本数为113,y_train为133,两者数量不匹配,训练时会触发维度错误。需检查数据加载或预处理流程,确保训练集输入与标签的样本数完全一致。
修正后的示例代码
# 假设是二分类任务 n_classes = 1 activation = 'sigmoid' model = sm.Unet('resnet50', encoder_weights='imagenet', classes=n_classes, activation=activation) model.compile(optimizer=Adam(learning_rate=1e-3), loss='binary_crossentropy', metrics=['accuracy']) model.summary() # 确保X_train和y_train样本数一致,使用训练集训练,验证集传入正确的输入和标签 history = model.fit(X_train, y_train, batch_size=1, verbose=1, epochs=5, validation_data=(X_val, y_val), shuffle=True)
内容的提问来源于stack exchange,提问作者Shrey Jindal
相关产品推荐
相关产品推荐

