我有一个专为多重分类问题设计的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之间的数字解释为属于该类别的概率。

一个样本的公式为:

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 = 1y2 = 0y3 = 1的训练集,并且您预测了y1_hat = 0.6y2_hat = 0.2y3_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/

10-12 19:32
查看更多