Keras 中的“指标”是啥?

Posted

技术标签:

【中文标题】Keras 中的“指标”是啥?【英文标题】:What is "metrics" in Keras?Keras 中的“指标”是什么? 【发布时间】:2018-04-28 08:44:01 【问题描述】:

我还不清楚metrics 是什么(如下代码所示)。他们到底在评估什么?为什么我们需要在model 中定义它们?为什么我们可以在一个模型中拥有多个指标?更重要的是,这一切背后的机制是什么? 任何科学参考也值得赞赏。

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

【问题讨论】:

这些答案(免责声明:我的)也可能有用:1)How does Keras evaluate the accuracy? 2)Loss & accuracy - Are these reasonable learning curves? 【参考方案1】:

如keras metrics页面所述:

指标是用于判断您的绩效的函数 型号

指标经常与提前停止回调一起使用,以终止训练并避免过度拟合

【讨论】:

你能提供一个参考来看看它的机制是什么吗?【参考方案2】:

参考:Keras Metrics Documentation

正如keras metrics 的文档页面中所给出的,metric 会判断模型的性能。 compile 方法中的 metrics 参数包含模型在其训练和测试阶段需要评估的指标列表。 指标如下:

binary_accuracy

categorical_accuracy

sparse_categorical_accuracy

top_k_categorical_accuracy

sparse_top_k_categorical_accuracy

是编译模型时在 metrics 参数中提供的可用度量函数。

指标函数也可以自定义。当需要评估多个指标时,它以dictionarylist 的形式传递。

您可以在here找到深入了解指标的一个重要资源

【讨论】:

【参考方案3】:

所以为了了解metrics 是什么,最好先了解loss 函数是什么。神经网络大多使用梯度方法通过递减loss函数的迭代过程进行训练。

loss 被设计为具有两个关键属性 - 首先,它的值越小,您的模型越适合您的数据,其次,它应该是可微的。所以,知道了这一点,我们可以完全定义 metric 是什么:它是一个函数,给定示例中的预测值和基本真实值,为您提供模型“适合度”的标量度量,以适应​​您的数据有。因此,正如您所见,loss 函数是一个度量标准,但相反的情况并不总是成立。要了解这些差异,让我们看一下metrics 用法的最常见示例:

    使用不可微函数测量网络的性能: 例如准确性是不可微分的(甚至不是连续的),因此您无法直接优化您的网络 w.r.t.给它。但是,您可以使用它来选择精度最高的模型。

    当您的最终损失是其中几个损失的组合时,获取不同损失函数的值:假设您的损失有一个正则化项,用于衡量您的权重与 @987654330 的差异@,以及衡量模型适合度的术语。在这种情况下,您可以使用 metrics 来单独跟踪模型的适应度在不同时期的变化情况。

    跟踪您不想直接优化模型的度量: 所以 - 假设您正在解决一个您最关心的多维回归问题@ 987654332@,但同时您对您的解决方案的cosine-distance 如何随时间变化感兴趣。那么,最好使用metrics

我希望上面的解释能够清楚地说明指标的用途,以及为什么您可以在一个模型中使用多个指标。所以现在,让我们谈谈它们在keras 中的使用机制。训练时有两种计算方法:

    编译时使用metrics定义:这是你直接问的。在这种情况下,keras 为您定义的每个指标定义一个单独的张量,以便在训练时计算它。这通常会使计算速度更快,但这是以额外编译为代价的,而且指标应该根据keras.backend 函数来定义。

    使用keras.callback:很高兴您可以使用Callbacks 来计算您的指标。由于每个回调都有一个默认属性model,因此您可以在训练时使用model.predict 或模型参数计算各种指标。此外,它使得计算它成为可能,不仅是 epoch-wise,而且是 batch-wise,或 training-wise。这是以计算速度较慢和逻辑更复杂为代价的 - 因为您需要自己定义指标。

Here您可以找到可用指标的列表,以及如何定义自己的指标的示例。

【讨论】:

当您说“跟踪测量”时 - 这是为了让我们可以在训练完成后可视化指标以查看模型训练的速度/流畅程度吗? 关于如何实现或使用批量或训练指标的任何参考资料?【参考方案4】:

从实现的角度来看,损失和指标在 Keras 中实际上是相同的功能:

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

【讨论】:

作为对 keras 相关事物的有用答案的补充......“除了上述指标之外,您还可以使用损失函数页面中描述的任何损失函数作为指标。” ...来自keras docs。 @Marcin Możejko 的精彩解释说“损失函数是一个度量”。在 Keras 文档中并没有注意到相同的函数可用于损失和指标,但他们确实在文档底部以较小的字体说明了这一点。【参考方案5】:

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

【讨论】:

以上是关于Keras 中的“指标”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何理解Keras中的指标Metrics

多标签分类 Keras 指标

keras 的指标返回啥值?标量还是张量?

即使使用相同的数据,Keras 训练和验证指标值也不同(逻辑回归)

多标签分类:keras自定义指标

Keras scikit-learn 包装器在使用 one-hot 编码标签的交叉验证中的评分指标