当损耗是均方误差(MSE)时,什么函数定义了Keras的准确度?

End*_*oen 15 regression machine-learning mean-square-error keras loss-function

当损失函数是均方误差时,如何定义准确度?是绝对百分比误差吗?

我使用的模型具有输出激活线性和编译 loss= mean_squared_error

model.add(Dense(1))
model.add(Activation('linear'))  # number

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

Epoch 99/100
1000/1000 [==============================] - 687s 687ms/step - loss: 0.0463 - acc: 0.9689 - val_loss: 3.7303 - val_acc: 0.3250
Epoch 100/100
1000/1000 [==============================] - 688s 688ms/step - loss: 0.0424 - acc: 0.9740 - val_loss: 3.4221 - val_acc: 0.3701
Run Code Online (Sandbox Code Playgroud)

那么例如val_acc:0.3250是什么意思?Mean_squared_error应该是标量而不是百分比 - 不应该吗?那么val_acc - 均方误差,或平均百分比误差或其他函数?

根据维基百科上的MSE定义:https://en.wikipedia.org/wiki/Mean_squared_error

MSE是估计量质量的度量 - 它总是非负的,接近零的值更好.

这是否意味着价值val_acc: 0.0优于val_acc: 0.325

编辑:我训练时精确度量输出的更多示例 - 随着我训练更多,精度会增加.虽然损失函数 - mse应该减少.是否为mse定义了准确度 - 它是如何在Keras中定义的?

lAllocator: After 14014 get requests, put_count=14032 evicted_count=1000 eviction_rate=0.0712657 and unsatisfied allocation rate=0.071714
1000/1000 [==============================] - 453s 453ms/step - loss: 17.4875 - acc: 0.1443 - val_loss: 98.0973 - val_acc: 0.0333
Epoch 2/100
1000/1000 [==============================] - 443s 443ms/step - loss: 6.6793 - acc: 0.1973 - val_loss: 11.9101 - val_acc: 0.1500
Epoch 3/100
1000/1000 [==============================] - 444s 444ms/step - loss: 6.3867 - acc: 0.1980 - val_loss: 6.8647 - val_acc: 0.1667
Epoch 4/100
1000/1000 [==============================] - 445s 445ms/step - loss: 5.4062 - acc: 0.2255 - val_loss: 5.6029 - val_acc: 0.1600
Epoch 5/100
783/1000 [======================>.......] - ETA: 1:36 - loss: 5.0148 - acc: 0.2306
Run Code Online (Sandbox Code Playgroud)

des*_*aut 28

您的问题至少有两个不同的问题.

第一个应该从Matias的评论和其他答案中清楚地看出:准确性在回归问题中没有意义,例如你的; 另见patyork在这个 Keras帖子中的评论.无论好坏,事实是Keras不会"保护"您或任何其他用户在您的代码中放置无意义的请求,即您不会收到任何错误,甚至是警告,您正在尝试执行某些操作没有意义,例如在回归设置中请求准确性.

澄清之后,另一个问题是:

由于Keras确实返回了"准确度",即使在回归设置中,究竟是什么以及如何计算?

为了说明这一点,让我们回到一个公共数据集(因为你没有提供有关你的数据的任何细节),即波士顿房价数据集(本地保存为housing.csv),并运行如下的简单实验:

import numpy as np
import pandas
import keras

from keras.models import Sequential
from keras.layers import Dense

# load dataset
dataframe = pandas.read_csv("housing.csv", delim_whitespace=True, header=None)
dataset = dataframe.values
# split into input (X) and output (Y) variables
X = dataset[:,0:13]
Y = dataset[:,13]

model = Sequential()
model.add(Dense(13, input_dim=13, kernel_initializer='normal', activation='relu'))
model.add(Dense(1, kernel_initializer='normal'))
# Compile model asking for accuracy, too:
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

model.fit(X, Y,
     batch_size=5,
     epochs=100,
     verbose=1)
Run Code Online (Sandbox Code Playgroud)

在您的情况下,模型拟合历史(此处未显示)显示减少的损失,并且精度大致增加.现在让我们使用适当的Keras内置函数评估同一训练集中的模型性能:

score = model.evaluate(X, Y, verbose=0)
score
# [16.863721372581754, 0.013833992168483997]
Run Code Online (Sandbox Code Playgroud)

score数组的确切内容取决于我们在模型编译期间确切要求的内容; 在我们的例子中,第一个元素是损失(MSE),第二个元素是"准确度".

在这一点上,让我们来看看Keras的定义binary_accuracymetrics.py的文件:

def binary_accuracy(y_true, y_pred):
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
Run Code Online (Sandbox Code Playgroud)

因此,在Keras生成预测之后y_pred,它首先对它们进行舍入y_true,然后在获得平均值之前检查它们中有多少等于真实标签.

在我们的例子中,让我们使用普通的Python和Numpy代码复制这个操作,其中真正的标签是Y:

y_pred = model.predict(X)
l = len(Y)
acc = sum([np.round(y_pred[i])==Y[i] for i in range(l)])/l
acc
# array([0.01383399])
Run Code Online (Sandbox Code Playgroud)

宾果游戏!这实际上是score[1]上面返回的相同值...

简而言之:由于你(错误地)metrics=['accuracy']在你的模型编辑中提出要求,Keras会尽力满足你,并且会返回一些"精确度",如上所示计算,尽管这在你的设置中完全没有意义.


有很多设置,Keras在引擎盖下执行相当无意义的操作,而不向用户提供任何提示或警告; 我碰巧遇到的其中两个是:

  • 谢谢!那就是我最讨厌的事情。不会再使用Accuracy-进行回归。 (2认同)

BGr*_*raf 7

损失函数(在这种情况下为均方误差)用于指示您的预测与目标值的偏离程度。在训练阶段,将根据此数量更新权重。如果您要处理分类问题,那么定义一个额外的度量标准(称为准确性)是很常见的。它监视在多少情况下预测到正确的类别。用百分比值表示。因此,值0.0表示无正确决策,而值1.0仅表示正确决策。当您的网络正在训练时,损耗在减少,通常精度会提高。

请注意,与丢失相反,通常不使用精度来更新网络参数。它有助于监视学习进度和网络的当前性能。

  • 在回归问题的情况下,由于没有要测量的“错误”或“正确”决定,因此没有理由计算准确性度量。如果要预测连续目标,则以喀拉斯语表示的精度度量没有相关含义。您应该使用均方误差之类的数量来评估网络性能。 (2认同)

归档时间:

查看次数:

8738 次

最近记录:

6 年,7 月 前