我有一个专为多分类问题设计的 LSTM 模型。训练时,准确率实际上是 1.00。但仍然返回小的损失值。这是什么意思?所有目标都被正确预测。为什么损失值不能为零?
adadelta = Adadelta(clipnorm=1.)
model.compile(optimizer=adadelta,
loss='categorical_crossentropy',
sample_weight_mode='temporal',
metrics=['accuracy'])
损失值如下。
Epoch 12/12
1000/1000 [==============================] - 38s - loss: 1.2053e-04 - acc: 1.0000
最佳答案
网络正在优化损失。在您的情况下,损失是分类交叉熵。分类衡量正确概率的对数值。
网络预测的一个样本 y_pred
是这样的,y_true
是真正的目标值:y_true
是二进制的,因为你想要预测它是否属于某个类别,y_pred
是一个介于 0 和 1 之间的 float ,您可以将其解释为属于该类别的概率。
一个样本的公式是:
loss_sample = y_true * ln(y_pred) + (1-y_true) * ln(1-y_pred)
因此,如果 y_true
为 1(样本属于该类),则 loss_sample = ln(y_pred)
并且如果 y_true
为 0 ,然后是 loss_sample = ln(1-y_pred)
。这是有道理的,因为如果 y_true
为 1,您希望损失尽可能小,因此您希望 y_pred
为 1。如果 y_true
为 0,如果 1-y_pred
接近 1,你的损失会减少,所以如果 y_pred 为 0。
至于准确度,如果所有样本属于正确类别的概率高于 0.5 阈值,则准确度等于 1。
这意味着如果您有一个包含 3 个样本和目标的训练集 y1 = 1
、y2 = 0
、y3 = 1
和您预测 y1_hat = 0.6
、y2_hat = 0.2
、y3_hat = 0.9
。那么你的准确度将是 100%,但你的损失将是 loss = ln(0.6) + ln(1-0.2) + ln(0.9)
,它不是零。
总结:您预测属于某个类别的概率,损失计算正确的置信度,而准确性只是根据预测做出决定,而不考虑置信度。
您可以获得完美的准确度分数,因为您的网络做出了正确的决定,但是您的损失是积极的,因为您的网络对结果并不完全有信心。
是不是更清楚了?
关于python - 即使 keras 中的精度为 1.00,categorical_crossentropy 也会返回较小的损失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43025416/