即使 keras 中的准确度为 1.00,categorical_crossentropy 也会返回小的损失值

jef*_*jef 2 python machine-learning deep-learning keras cross-entropy

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

adadelta = Adadelta(clipnorm=1.)
model.compile(optimizer=adadelta,
              loss='categorical_crossentropy',
              sample_weight_mode='temporal',
              metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

损失值如下所示。

Epoch 12/12
1000/1000 [==============================] - 38s - loss: 1.2053e-04 - acc: 1.0000    
Run Code Online (Sandbox Code Playgroud)

Nas*_*Ben 5

网络正在优化损失。在您的情况下,损失是分类交叉熵。分类测量正确概率的对数值。

对于y_pred您的网络预测y_true为真实目标值的一个样本,它是这样的:y_true是二进制的,因为您想预测它是否属于某个类别,并且y_pred是一个介于 0 和 1 之间的浮点数,您可以将其解释为概率属于班级。

一个样本的公式是:

loss_sample = y_true * ln(y_pred) + (1-y_true) * ln(1-y_pred)
Run Code Online (Sandbox Code Playgroud)

所以如果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 = 0y3 = 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)是非零。

总结一下:您预测属于某个类别的概率,损失计算正确的置信度,准确度只是根据预测做出决策,而不考虑置信度。

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

是不是更清楚了?