【问题标题】:Why is it possible to have low loss, but also very low accuracy, in a convolutional neural network?为什么卷积神经网络的损失可能很低,但准确率也很低?
【发布时间】:2016-12-08 07:22:52
【问题描述】:

我是机器学习的新手,目前正在尝试训练具有 3 个卷积层和 1 个全连接层的卷积神经网络。我使用 25% 的辍学概率和 0.0001 的学习率。我有 6000 个 150x200 的训练图像和 13 个输出类。我正在使用张量流。我注意到一个趋势,即我的损失稳步减少,但我的准确性仅略有增加,然后又回落。我的训练图像是蓝线,我的验证图像是橙线。 x 轴是步数。

我想知道是否有我不理解的东西或者这种现象的可能原因是什么?从我读过的材料来看,我认为低损耗意味着高准确度。 这是我的损失函数。

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))

【问题讨论】:

  • 听说过过拟合吗?
  • 低训练损失应该意味着低训练集错误。你的损失有多低?您的规模为数百万,从图中不清楚您的训练损失是否很低(小于 1)
  • 是的,我听说过过度拟合,但我假设如果你过度拟合,你的训练数据仍然会有很高的准确性。对不起这个规模,我训练结束时损失在 1-10 之间。
  • 准确率被称为“0-1”损失,而人们通常最小化交叉熵损失。这些损失是相互关联的——0 交叉熵损失意味着 100% 的准确度,并且交叉熵的准确度有一些界限,因此低交叉熵意味着高准确度。最典型的是,您的场景代表损失函数中的错误
  • 这是我的损失函数。成本 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))。其中 pred 是预测数组,y 是包含正确标签的数组。数组是 128x13,因为我有大小为 128 和 13 个类的批次。

标签: python machine-learning tensorflow deep-learning


【解决方案1】:

那是因为 LossAccuracy 是两个完全不同的东西(至少在逻辑上是这样)!

考虑一个您将loss 定义为的示例:

loss = (1-accuracy)

在这种情况下,当您尝试最小化 loss 时,accuracy 会自动增加。

现在考虑另一个将loss 定义为的示例:

loss = average(prediction_probabilities)

尽管它没有任何意义,但从技术上讲,它仍然是一个有效的损失函数,并且您的 weights 仍然经过调整,以尽量减少此类 loss

但正如您所见,在这种情况下,lossaccuracy 之间没有关系,因此您不能期望两者同时增加/减少。

注意:Loss 将始终被最小化(因此您的 loss 在每次迭代后都会减小)!

PS:请使用您尝试最小化的loss 函数更新您的问题。

【讨论】:

  • OP 评论说他们在 softmax 输出上使用多类 logloss。
  • @Sangram 嘿!我想知道,如果loss = average(prediction_probabilities) 被最小化,这意味着我的prediction_probabilities 越来越接近真实情况,这不是让我的准确性更好吗?
  • 不是真的!如果您尝试最小化 loss=average(prediction_probabilities),则会调整权重以使网络输出趋于为零,而这与准确性无关。如果网络输出特定类别的准确预测概率为零(例如对于正类别),则准确度就是该类别的普遍性。
【解决方案2】:

softmax_cross_entropy_with_logits() 和准确率是两个不同的概念,公式定义不同。在正常情况下,我们可以期望通过最小化 softmax 交叉熵来获得更高的准确率,但是它们的计算方式不同,所以我们不能期望它们总是以同步的方式增加或减少。

我们在 CNN 中使用 softmax 交叉熵,因为它对神经网络训练很有效。如果我们使用 loss = (1-accuracy) 作为损失函数,用我们目前成熟的反向传播训练方案来调整我们的 CNN 神经网络的权重很难得到更好的结果,我真的做到了,证实了这个结论,你也可以自己试试。可能是我们目前糟糕的反向传播训练方案造成的,也可能是我们神经元的定义造成的(我们需要将其更改为其他类型的神经元?),但无论如何,目前,使用损失函数中的准确率并不是一种有效的方法神经元网络训练,所以就用 softmax_cross_entropy_with_logits() 就像那些 AI 科学家告诉我们的那样,他们已经证实这种方式是有效的,对于其他方式,我们还不知道。

【讨论】:

  • 我目前正在学习新的在线培训,并对为什么我们需要使用 softmax_cross_entropy_with_logits() 有了新的理解。原因很简单:softmax 交叉熵函数是一个凸函数,而其他大多数函数都不是。所以我们可以通过在凸函数中找到局部最小值来找到全局最小值。但是对于非凸函数,例如loss = (1-accuracy),它有多个局部最小值,所以用我们的反向传播算法不可能找到合适的 W&b 值。
猜你喜欢
  • 2017-07-05
  • 1970-01-01
  • 2018-04-10
  • 2020-04-13
  • 1970-01-01
  • 2018-07-14
  • 2018-06-07
  • 1970-01-01
  • 2018-07-25
相关资源
最近更新 更多