当损失函数是均方误差时,如何定义准确度?是绝对百分比误差 - en.wikipedia.org/wiki/Mean_absolute_percentage_error?
我使用的模型输出activatoin linear,并使用loss = mean_squared_error进行编译
model.add(Dense(1))
model.add(Activation('linear')) # number
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
输出看起来像这样:
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
那么例如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.3250?
编辑:我训练时精确度量输出的更多示例 - 随着我训练更多,精度会增加 . 虽然损失函数 - 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
3 回答
您的问题至少有两个不同的问题 .
第一个应该从马蒂亚斯的评论和其他答案中清楚地看出:准确性在回归问题中是有意义的,例如你的;另见patyork在this Keras thread的评论 . 无论好坏,事实是Keras不会让你或任何其他用户在你的代码中放入没有意义的请求,即你不会得到任何错误,甚至是警告,你正在尝试一些不做的事情 . 感觉,例如在回归设置中请求准确性 .
澄清之后,另一个问题是:
Since Keras does indeed return an "accuracy", even in a regression setting, what exactly is it and how is it calculated?
为了解释一下,让我们回到一个公共数据集(因为你没有提供有关你的数据的任何细节),即Boston house price dataset(在本地保存为
housing.csv
),并按如下方式运行一个简单的实验:在您的情况下,模型拟合历史(此处未显示)显示减少的损失,并且精度大致增加 . 现在让我们使用适当的Keras内置函数评估同一训练集中的模型性能:
score
数组的确切内容取决于我们在模型编译期间确切要求的内容;在我们的例子中,第一个元素是损失(MSE),第二个元素是"accuracy" .在这一点上,让我们看看metrics.py file中Keras
binary_accuracy
的定义:因此,在Keras生成预测
y_pred
之后,它首先对它们进行舍入,然后在获得平均值之前检查它们中有多少等于真实标签y_true
.在我们的例子中,让我们使用普通的Python和Numpy代码复制这个操作,其中真正的标签是
Y
:宾果游戏!这实际上是上面
score[1]
返回的相同值...简而言之:由于你(错误地)在你的模型编辑中请求
metrics=['accuracy']
,Keras将do its best to satisfy you,并且将返回一些"accuracy",确实如上所示计算,尽管在你的设置中完全没有意义 .有很多设置,Keras在引擎盖下执行相当无意义的操作,而不向用户提供任何提示或警告;我碰巧遇到的其中两个是:
当在多类设置中,一个碰巧用
metrics=['accuracy']
请求loss='binary_crossentropy'
(而不是categorical_crossentropy
)时,给出无意义的结果 - 请参阅Keras binary_crossentropy vs categorical_crossentropy performance?和Why is binary_crossentropy more accurate than categorical_crossentropy for multiclass classification in Keras?中的答案完全禁用Dropout,在极端情况下请求辍学率为1.0时 - 请参阅Dropout behavior in Keras with rate=1 (dropping all input units) not as expected中的答案
损失函数(在这种情况下为均方误差)用于指示预测偏离目标值的距离 . 在训练阶段,权重会根据此数量进行更新 . 如果您正在处理分类问题,则定义称为准确性的其他度量标准是很常见的 . 它监视预测正确类别的情况 . 这表示为百分比值 . 因此,值0.0表示没有正确的决定,1.0表示只有正确的决定 . 当您的网络正在训练时,损失正在减少,通常准确性会提高 .
请注意,与丢失相反,准确性通常不用于更新网络参数 . 它有助于监控学习进度和网络的当前性能 .
@desertnaut has said very clearly 考虑以下两段代码
compile code
binary_accuracy code
你的标签应该是整数,因为keras不圆 y_true ,你得到高精度.......