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)
网络正在优化损失。在您的情况下,损失是分类交叉熵。分类测量正确概率的对数值。
对于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 = 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)是非零。
总结一下:您预测属于某个类别的概率,损失计算正确的置信度,准确度只是根据预测做出决策,而不考虑置信度。
您可以获得完美的准确度分数,因为您的网络做出了正确的决定,但由于您的网络对结果并不完全有信心,因此会出现正损失。
是不是更清楚了?
| 归档时间: |
|
| 查看次数: |
1925 次 |
| 最近记录: |