TensorFlow Keras ‘accuracy’ 指标的底层实现

在使用 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 还是概率,以及无论真实标签是独热编码向量还是整数索引?


我认为 logits 和概率的情况比较简单,因为无论哪种方式都可以通过 argmax 获得预测类别,但我希望能被指向 TensorFlow 2 源代码中实际进行计算的地方。

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


编辑在纯 Keras 中,metrics=['accuracy']Model.compile 方法 中被明确处理。


回答:

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

详细来说,在当前实现中,Model.compile 要么将度量处理委托给 Model._compile_eagerly(如果是急切执行),要么直接处理。在任何情况下,都会调用 Model._cache_output_metric_attributes,它会为未加权和加权的度量分别调用 collect_per_output_metric_info。该函数会遍历提供的度量,对每个度量调用 get_metric_function

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注