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 = 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)
,这是非零的。
总结:你预测属于某个class的概率,损失计算的是正确的置信度,而准确度只是根据在不考虑置信度的情况下进行预测。
您可以获得完美的准确度分数,因为您的网络做出了正确的决定,但您的损失是积极的,因为您的网络对结果并不完全有信心。
是不是更清楚了?
我有一个专为多分类问题设计的 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 = 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)
,这是非零的。
总结:你预测属于某个class的概率,损失计算的是正确的置信度,而准确度只是根据在不考虑置信度的情况下进行预测。
您可以获得完美的准确度分数,因为您的网络做出了正确的决定,但您的损失是积极的,因为您的网络对结果并不完全有信心。
是不是更清楚了?