Keras使用Sparse Categorical CrossEntropy出现形状不兼容问题
报错原因
你遇到的形状不匹配问题和SparseCategoricalCrossentropy损失本身无关,问题出在编译时引入的Precision和Recall指标:
- 当
label_mode='int'时,数据集输出的标签是形状为(batch_size,)的整数(对应三分类的0/1/2标签),而模型输出的预测结果是形状为(batch_size, 3)的概率分布。 - TensorFlow内置的
Precision、Recall指标默认适配二分类场景,且无法直接处理稀疏整数格式的多分类标签,计算指标时会尝试把形状为(batch_size, 1)的标签和(batch_size,3)的预测结果做运算,直接触发维度不匹配报错。 - 你切换到
categorical标签模式+CategoricalCrossentropy后,标签会被自动转成one-hot格式的(batch_size,3)张量,和预测结果形状匹配,所以指标可以正常计算。
修复方案(保留SparseCategoricalCrossentropy的前提下)
你只需要修改Precision和Recall的初始化参数,指定为多分类模式即可:
def compile_model(model, plot=False): model.compile( optimizer=tf.optimizers.Adam(1e-3), loss=tf.losses.SparseCategoricalCrossentropy(name='loss'), metrics=[ tfk.metrics.SparseCategoricalAccuracy(name='accuracy'), # 修改Precision、Recall参数适配多分类稀疏标签 tfk.metrics.Precision(name='precision', average='macro', num_classes=len(CLASS_NAMES)), tfk.metrics.Recall(name='recall', average='macro', num_classes=len(CLASS_NAMES)), ] ) model.summary() if plot: tfk.utils.plot_model(model, show_shapes=True)
参数说明:
num_classes:明确指定分类数为3,匹配你的三分类任务average:指定多分类下的指标计算方式,可选macro(各类别指标算术平均,对小类别样本公平)、micro(全局统计TP/FP/FN计算指标)、weighted(按各类别样本数加权平均),可根据你的数据集类别分布选择。
如果修改指标参数后仍报错,可在加载数据集后增加一步维度压缩处理,消除标签的多余维度:
def squeeze_label(image, label): return image, tf.squeeze(label) train_ds = train_ds.map(squeeze_label) val_ds = val_ds.map(squeeze_label)
内容的提问来源于stack exchange,提问作者user12205212
相关产品推荐
相关产品推荐

