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

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

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

如果想要使用交叉熵损失,情况并非如此:上述情况的四种组合中的每一种都需要在编译步骤中传递不同的 loss 值:
  • 如果模型输出概率并且ground truth标签是one-hot-encoded,那么loss='categorical_crossentropy'就可以工作。
  • 如果模型输出概率并且真实标签是整数索引,则 loss='sparse_categorical_crossentropy' 有效。
  • 如果模型输出 logits 并且地面实况标签是单热编码的,则 loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True) 起作用。
  • 如果模型输出 logits 并且真实标签是整数索引,则 loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) 有效。

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

    问题
    当用户在模型编译步骤中指定 metrics=['accuracy'] 允许正确执行准确度计算时,幕后发生了什么,无论模型是输出 logits 还是概率,以及地面实况标签是单热编码向量还是整数索引?

    我怀疑 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/

    10-12 21:25