categorical_crossentropy returns 即使在 keras 中精度为 1.00,损失值也很小

categorical_crossentropy returns small loss value even if accuracy is 1.00 in keras

我有一个专为多分类问题设计的 LSTM 模型。训练时,准确率实际上是 1.00。但还是returns小损失值。这是什么意思?所有目标都被正确预测。为什么损失值不能为零?

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 是二元的,因为你想预测它是否属于确定 class 与 y_pred 是一个介于 0 和 1 之间的浮点数,您可以将其解释为属于 class.

的概率

一个样本的公式是:

loss_sample = y_true * ln(y_pred) + (1-y_true) * ln(1-y_pred)

因此,如果 y_true 为 1(样本属于 class),则 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.

至于准确度,如果所有样本都属于正确 class 的概率高于 0.5 阈值,则准确度将等于 1。

这意味着如果您有一个包含 3 个样本和目标的训练集 y1 = 1y2 = 0y3 = 1,并且您预测 y1_hat = 0.6y2_hat = 0.2 , y3_hat = 0.9。那么你的准确度将是 100%,但你的损失将是 loss = ln(0.6) + ln(1-0.2) + ln(0.9),这是非零的。

总结:你预测属于某个class的概率,损失计算的是正确的置信度,而准确度只是根据在不考虑置信度的情况下进行预测。

您可以获得完美的准确度分数,因为您的网络做出了正确的决定,但您的损失是积极的,因为您的网络对结果并不完全有信心。

是不是更清楚了?