Keras中的“metrics”是什么?

45

对于我来说,metrics是什么(如下面的代码所示)仍不清楚。它们到底评估了什么?为什么需要在model中定义它们?我们为什么可以在一个模型中使用多个指标?更重要的是,这背后的机制是什么?同样欢迎任何科学参考资料。

model.compile(loss='mean_squared_error',
              optimizer='sgd',
              metrics=['mae', 'acc'])

1
以下是一些有用的答案(免责声明:属于我自己):1)Keras如何评估准确性? 2)损失和准确性 - 这些学习曲线合理吗? - desertnaut
5个回答

78
为了理解什么是指标(metrics),首先需要了解什么是损失(loss)函数。神经网络通常使用梯度方法进行训练,通过不断减小损失(loss)函数来迭代地进行训练。 损失(loss)函数被设计为具有两个关键属性:首先,它的值越小,说明模型更适合数据;其次,它应该是可微分的。因此,我们可以完全定义指标(metrics):给定预测值和实际值,它提供了一个标量度量你的模型对于你所拥有的数据的“适应性”。因此,损失(loss)函数是一种指标(metrics),但反过来则并不总是成立。为了理解这些差异,让我们看看指标(metrics)用法的最常见示例:
  1. 使用不可微分函数来衡量网络性能:例如,准确率不可微分(甚至不连续),因此您不能直接针对其优化网络。但是,您可以使用它来选择具有最佳准确率的模型。

  2. 当最终损失是其中几种损失函数的组合时,获取不同损失函数的值:假设您的损失有一个正则化项,用于衡量权重与0的差异,以及一个用于测量模型适应性的项。在这种情况下,您可以使用指标(metrics)来单独跟踪模型适应性随时间变化的情况。

  3. 跟踪一项度量,而不想直接优化你的模型:因此 - 假设你正在解决一个多维回归问题,你主要关心mse,但与此同时,你也想知道你的解决方案的余弦距离如何随时间变化。那么,使用指标(metrics)是最好的选择。

我希望前面的解释已经说明了度量标准的用途,以及为什么可以在一个模型中使用多个度量标准。现在,让我们来谈谈它们在keras中的使用机制。在训练过程中,有两种计算方法:

  1. 使用编译时定义的metrics:这正是你之前直接问到的。在这种情况下,keras会为您定义的每个度量标准定义一个单独的张量,以便在训练时进行计算。这通常可以加快计算速度,但也需要额外的编译成本,并且必须使用keras.backend函数定义度量标准。

  2. 使用keras.callback:您可以使用回调函数(Callbacks)来计算您的度量标准。由于每个回调函数都具有默认属性model,因此您可以使用model.predict或模型参数进行各种度量标准的计算。此外,这使得计算不仅可以按照每轮(epochs)进行,还可以按照每批(batch)或整个训练过程(training)进行。这样做的代价是速度较慢的计算,以及更复杂的逻辑–因为您需要自己定义度量标准。

在这里,您可以找到可用度量标准的列表,以及如何定义自己的示例。


当你说“跟踪度量”时,这是为了在训练完成后可视化指标,以查看模型训练的速度/平稳程度吗? - Nic Cottrell
有关如何实现或使用批次或训练度量的任何参考资料吗? - rjurney

8

如在 keras度量 页面所述:

度量是用于评估模型性能的函数

通过使用早期停止回调与度量一起,可以终止训练并避免过度拟合。


你能提供一个参考资料,以便了解它的机制吗? - DragonKnight

4
参考文献:Keras度量标准文档 正如keras metrics文档页面所述,metric用于评估模型性能。在compile方法中,metrics参数保存了需要在模型的训练和测试阶段评估的度量标准列表。 度量标准包括:
  • binary_accuracy

  • categorical_accuracy

  • sparse_categorical_accuracy

  • top_k_categorical_accuracy

  • sparse_top_k_categorical_accuracy

这些可用的度量标准函数是在编译模型时在metrics参数中提供的。
度量标准函数也是可定制的。当需要评估多个度量标准时,它以dictionarylist的形式传递。
深入了解指标的重要资源可以在这里找到。

2

从实现的角度来看,在Keras中,损失函数和评估指标其实是相同的函数:

Original Answer翻译成:"最初的回答"

Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow.keras as Keras
>>> print(Keras.losses.mean_squared_error == Keras.metrics.mean_squared_error)
True
>>> print(Keras.losses.poisson == Keras.metrics.poisson)
True

1
作为对与Keras相关的问题有用回答的补充,“除了上述指标,您还可以使用损失函数页面中描述的任何损失函数作为指标。”来自Keras文档。@Marcin Możejko的出色解释说“损失函数是一种指标”。在Keras文档中并不明显地表明相同的函数可用于损失和指标,但它们确实在文档底部以较小的字体进行了说明。 - spencer741

1

损失函数有助于找到模型可以产生的最佳解决方案。指标实际上告诉我们它有多好。想象一下,我们找到了回归线(具有最小平方误差)。那是一个足够好的解决方案吗?这就是指标会回答的问题(理想情况下考虑数据的形状和分布!)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接