Python实现CNN报错:logits和labels形状不匹配((4,2)vs(4,1))如何解决
Keras二分类任务logits与labels形状不匹配问题解决方案
错误根因
错误核心为输出层配置与标签编码格式不匹配:
当前输出层采用2个神经元+softmax激活的二分类多分类处理模式,要求标签为one-hot编码,形状为(样本数, 2);但使用的标签是形状为(样本数,1)的0/1整数标签,因此触发形状不匹配报错。此前调整标签为(-1,1)的操作未解决编码不匹配的核心问题。
可行解决方案
方案1:保留现有输出层配置,调整标签编码
将整数标签转换为one-hot编码即可适配现有输出层,代码如下:
from keras.utils import to_categorical # 转为形状为(样本数,2)的one-hot标签 train_labels = to_categorical(train_labels, num_classes=2) val_labels = to_categorical(val_labels, num_classes=2)
编译模型时损失函数使用categorical_crossentropy。
方案2:修改输出层配置,适配现有整数标签
二分类任务可以直接使用1个神经元+sigmoid激活的输出层,直接适配形状为(样本数,1)的整数标签,修改输出层代码如下:
# 替换原有fc2层代码 fc2 = Dense(1, activation='sigmoid')(fc1)
编译模型时损失函数使用binary_crossentropy,此前调整为(-1,1)格式的标签可直接使用。
注意:两种方案的损失函数必须和输出层配置对应,混用会导致训练异常或新的报错。
内容的提问来源于stack exchange,提问作者James Pack
相关产品推荐
相关产品推荐

