You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在TensorFlow中添加tf.keras.metrics.Precision时触发ValueError

问题解决:多分类迁移学习中Precision指标形状不兼容报错

错误原因

你使用的tf.keras.metrics.Precision默认要求标签为one-hot编码格式(形状与模型输出一致,如(None,4)),但通过image_dataset_from_directory加载的数据集是稀疏整数标签(形状为(None,1),每个样本的标签是单个整数类别)。模型输出是(None,4)的softmax概率分布,两者形状不匹配,因此触发ValueError: Shapes (None, 4) and (None, 1) are incompatible错误。

而SparseCategoricalAccuracy是TensorFlow专门为稀疏整数标签设计的指标,所以能正常工作。

解决方案

直接使用针对稀疏标签的多分类精确率指标tf.keras.metrics.SparseCategoricalPrecision替换普通的Precision即可,无需修改数据集或损失函数。

修改后的编译代码片段

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
    loss=tf.keras.losses.SparseCategoricalCrossentropy(),
    metrics=[
        tf.keras.metrics.SparseCategoricalAccuracy(name='accuracy'),
        tf.keras.metrics.SparseCategoricalPrecision(name="precision"),  # 替换为稀疏版本
    ]
)

额外说明

如果坚持使用普通Precision指标,需要将数据集的稀疏标签转换为one-hot编码,同时将损失函数改为CategoricalCrossentropy,示例如下(此方法相对繁琐):

# 转换数据集标签为one-hot
train_set = train_set.map(lambda x, y: (x, tf.one_hot(y, depth=num_classes)))

# 修改损失函数和指标
model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
    loss=tf.keras.losses.CategoricalCrossentropy(),
    metrics=[
        tf.keras.metrics.CategoricalAccuracy(name='accuracy'),
        tf.keras.metrics.Precision(name="precision"),
    ]
)

内容的提问来源于stack exchange,提问作者Kun.tito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:05:18