python - TensorFlow Keras 'accuracy' 引擎盖下的指标实现

标签 python tensorflow machine-learning deep-learning tf.keras

在使用 TensorFlow Keras 构建分类器时,人们通常会在编译步骤中通过指定 metrics=['accuracy'] 来监控模型准确性:

model = tf.keras.Model(...)
model.compile(optimizer=..., loss=..., metrics=['accuracy'])

无论模型是否输出 logits 或类概率,以及模型是否期望地面实况标签是单热编码向量或整数索引(即区间 [0 中的整数),这都会正确运行, n_classes)).

如果想使用交叉熵损失,情况就不同了:上述四种情况的每一种组合都需要在编译步骤中传递不同的loss值:

  1. 如果模型输出概率并且地面实况标签是单热编码的,则 loss='categorical_crossentropy' 有效。

  2. 如果模型输出概率并且地面实况标签是整数索引,则 loss='sparse_categorical_crossentropy' 有效。

  3. 如果模型输出 logits 并且地面实况标签是单热编码的,则 loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True) 有效。

  4. 如果模型输出 logits 并且真实标签是整数索引,则 loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) 有效。

    <

似乎仅指定 loss='categorical_crossentropy' 不足以处理这四种情况,而指定 metrics=['accuracy'] 足够健壮。


问题 当用户在模型编译步骤中指定 metrics=['accuracy'] 时幕后发生了什么,无论模型是否输出 logits 或概率以及是否ground truth 标签是单热编码向量还是整数索引?


我怀疑 logits 与概率的情况很简单,因为无论哪种方式都可以将预测的类作为 argmax 获得,但理想情况下,我希望指出 TensorFlow 2 源代码中计算实际完成的位置。

请注意我目前使用的是TensorFlow 2.0.0-rc1 .


编辑 在纯 Keras 中,metrics=['accuracy']Model.compile method 中显式处理.

最佳答案

找到了:这在tensorflow.python.keras.engine.training_utils.get_metric_function中处理.特别是,检查输出形状以确定使用哪个精度函数。

详细说明,在当前的实现中Model.compile要么将度量处理委托(delegate)给 Model._compile_eagerly (如果急切地执行)或直接执行。在任何一种情况下,Model._cache_output_metric_attributes被调用,调用collect_per_output_metric_info对于未加权和加权指标。此函数遍历提供的指标,对每个指标调用 get_metric_function

关于python - TensorFlow Keras 'accuracy' 引擎盖下的指标实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58001456/

相关文章:

python - 使用 TensorFlow 数据集进行验证集

python - 如何划分字典值?

python - 如何在 Keras 的函数式 API 中构建以嵌套模型的一层结尾的子模型

machine-learning - Tensorflow对象检测API中的模型配置参数是什么?

python :APNs SSLError

python - 在 Python 中进行分层采样,无需使用任何机器学习

python - LSTM输入形状错误: Input 0 is incompatible with layer sequential_1

arm - 从 TensorFlow 图中清除 dropout 操作

python - 多标签分类: keras custom metrics

python - 神经网络反向传播未完全训练