对于我来说,metrics
是什么(如下面的代码所示)仍不清楚。它们到底评估了什么?为什么需要在model
中定义它们?我们为什么可以在一个模型中使用多个指标?更重要的是,这背后的机制是什么?同样欢迎任何科学参考资料。
model.compile(loss='mean_squared_error',
optimizer='sgd',
metrics=['mae', 'acc'])
对于我来说,metrics
是什么(如下面的代码所示)仍不清楚。它们到底评估了什么?为什么需要在model
中定义它们?我们为什么可以在一个模型中使用多个指标?更重要的是,这背后的机制是什么?同样欢迎任何科学参考资料。
model.compile(loss='mean_squared_error',
optimizer='sgd',
metrics=['mae', 'acc'])
指标(metrics)
,首先需要了解什么是损失(loss)函数
。神经网络通常使用梯度方法进行训练,通过不断减小损失(loss)函数
来迭代地进行训练。
损失(loss)函数
被设计为具有两个关键属性:首先,它的值越小,说明模型更适合数据;其次,它应该是可微分的。因此,我们可以完全定义指标(metrics)
:给定预测值和实际值,它提供了一个标量度量你的模型对于你所拥有的数据的“适应性”。因此,损失(loss)函数
是一种指标(metrics)
,但反过来则并不总是成立。为了理解这些差异,让我们看看指标(metrics)
用法的最常见示例:
使用不可微分函数来衡量网络性能:例如,准确率不可微分(甚至不连续),因此您不能直接针对其优化网络。但是,您可以使用它来选择具有最佳准确率的模型。
当最终损失是其中几种损失函数的组合时,获取不同损失函数的值:假设您的损失有一个正则化项,用于衡量权重与0的差异,以及一个用于测量模型适应性的项。在这种情况下,您可以使用指标(metrics)
来单独跟踪模型适应性随时间变化的情况。
跟踪一项度量,而不想直接优化你的模型:因此 - 假设你正在解决一个多维回归问题,你主要关心mse
,但与此同时,你也想知道你的解决方案的余弦距离如何随时间变化。那么,使用指标(metrics)
是最好的选择。
我希望前面的解释已经说明了度量标准的用途,以及为什么可以在一个模型中使用多个度量标准。现在,让我们来谈谈它们在keras
中的使用机制。在训练过程中,有两种计算方法:
使用编译时定义的metrics
:这正是你之前直接问到的。在这种情况下,keras
会为您定义的每个度量标准定义一个单独的张量,以便在训练时进行计算。这通常可以加快计算速度,但也需要额外的编译成本,并且必须使用keras.backend
函数定义度量标准。
使用keras.callback
:您可以使用回调函数(Callbacks)来计算您的度量标准。由于每个回调函数都具有默认属性model
,因此您可以使用model.predict
或模型参数进行各种度量标准的计算。此外,这使得计算不仅可以按照每轮(epochs)进行,还可以按照每批(batch)或整个训练过程(training)进行。这样做的代价是速度较慢的计算,以及更复杂的逻辑–因为您需要自己定义度量标准。
在这里,您可以找到可用度量标准的列表,以及如何定义自己的示例。
keras metrics
文档页面所述,metric
用于评估模型性能。在compile
方法中,metrics
参数保存了需要在模型的训练和测试阶段评估的度量标准列表。
度量标准包括:
binary_accuracy
categorical_accuracy
sparse_categorical_accuracy
top_k_categorical_accuracy
和
sparse_top_k_categorical_accuracy
metrics
参数中提供的。dictionary
或list
的形式传递。从实现的角度来看,在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
损失函数有助于找到模型可以产生的最佳解决方案。指标实际上告诉我们它有多好。想象一下,我们找到了回归线(具有最小平方误差)。那是一个足够好的解决方案吗?这就是指标会回答的问题(理想情况下考虑数据的形状和分布!)。