我有一个专为多重分类问题设计的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 = 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/