在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
相关产品推荐
相关产品推荐

