ISIC皮肤癌数据集训练CNN时出现(None,1)与(None,9)形状不兼容错误
错误原因
你当前的标签格式和使用的损失函数要求不匹配:
- 你使用的
categorical_crossentropy损失要求标签为One-Hot编码格式,形状需要和模型输出一致为(None, 9) - 从你给出的数据集信息可以看到,你的标签是整数索引格式,形状为
(None,)(扩展后为(None,1)),因此触发形状不兼容错误
解决方案
方案1(推荐,修改量最小):更换损失函数
直接把模型编译时的损失函数替换为sparse_categorical_crossentropy,该损失函数原生支持整数格式的多分类标签,无需修改数据集:
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
方案2:对标签做One-Hot编码
如果你需要保留categorical_crossentropy损失,可以在数据集预处理阶段将标签转换为独热编码:
# 对训练集和验证集做统一处理 def one_hot_encode(x, y): return x, tf.one_hot(y, depth=num_classes) train_ds = train_ds.map(one_hot_encode) val_ds = val_ds.map(one_hot_encode)
额外优化建议:你当前的卷积层后没有添加池化层,会导致特征图尺寸过大,Flatten后全连接层参数量过高,容易过拟合、训练速度慢,建议在每个卷积+激活层后添加
layers.MaxPooling2D((2,2))层压缩特征尺寸。
内容的提问来源于stack exchange,提问作者Sourodip Kundu
相关产品推荐
相关产品推荐

