【问题标题】:Why does my neural network trained on MNIST data set not predict 7 and 9 correctly?为什么我在 MNIST 数据集上训练的神经网络不能正确预测 7 和 9?
【发布时间】:2015-12-10 11:49:02
【问题描述】:

我正在使用 Matlab (github code repository)。网络详情如下:

  • 隐藏单位:100(变量)

  • 纪元:500

  • 批量:100

正在使用反向传播算法更新权重。

我已经能够识别我在 Photoshop 中绘制的 0,1,2,3,4,5,6,8。

但是 7,9 无法识别,但在测试集上运行时,我只得到 749/10000 错误,它正确分类了 9251/10000。

知道可能出了什么问题吗?因为它正在学习并且基于测试集的结果它的学习是正确的。

【问题讨论】:

  • 答案:很多事情都可能是错误的。例如:如果你在不使用 9 的情况下训练你的 NN,那么检测 9 会很糟糕。如果所有 9 在训练中看起来都相似,然后在测试中出现非常不同的 9,那就不好了。也许你的神经网络不够复杂。等等等等等等
  • 它检测到什么7? 2?一个想法是尝试将那些无法检测到的样本添加到您的训练集中,让您的 NN 体验新功能。
  • 它检测除 7 和 9 之外的所有内容。我已经在 MNIST 数据集上对其进行了训练,其中包含 9 和 7。我假设 MNIST 包含 7 和 9 的正确表示。我试图检测已正确绘制。 sevennine
  • 当你说7和9不能识别时,是不是说749错误都对应7和9?或者你的意思是他们没有与之相关的特征向量?还是?
  • @GameOfThrows 错误是随机的,不仅是 7 和 9,还包含其他数字。但是当我在 Photoshop 中制作自己的 7 和 9 并尝试通过网络传递时,它们无法正确识别。

标签: matlab machine-learning neural-network image-recognition mnist


【解决方案1】:

我没有在您的代码中看到任何完全不正确的地方,但是有很多可以改进的地方:

  1. 您使用它来设置初始权重:

    hiddenWeights = rand(hiddenUnits,inputVectorSize);
    outputWeights = rand(outputVectorSize,hiddenUnits);
    
    hiddenWeights = hiddenWeights./size(hiddenWeights, 2);
    outputWeights = outputWeights./size(outputWeights, 2);
    

    我认为这会使你的体重非常小。不仅如此,您将没有负值,因此您将丢弃 sigmoid 值范围的一半。我建议你试试:

    weights = 2*rand(x, y) - 1
    

    这将在[-1, 1] 中生成随机数。然后你可以尝试除以这个区间以获得更小的权重(尝试除以大小的 sqrt)。

  2. 您将其用作输出增量:

    outputDelta = dactivation(outputActualInput).*(outputVector - targetVector) % (tk-yk)*f'(yin)
    

    如果使用平方损失函数,则乘以导数。对于日志丢失(通常用于分类),您应该只有outputVector - targetVector。它可能没有那么大的不同,但您可能想尝试一下。

  3. 你在 cmets 中说网络没有检测到你自己的七分之一和九分之一。这可能表明对 MNIST 数据的过度拟合。为了解决这个问题,您需要在网络中添加某种形式的正则化:权重衰减或 dropout。

  4. 如果您还没有尝试过,也应该尝试不同的学习率。

  5. 您似乎没有任何偏置神经元。除输出层外,每一层都应该有一个神经元,它只将值1 返回到下一层。您可以通过向输入数据添加另一个始终为1 的功能来实现这一点。

MNIST 是一个大数据集,目前仍在研究更好的算法。你的网络非常基础,很小,没有正则化,没有偏置神经元,也没有对经典梯度下降的改进。它运行得不太好也就不足为奇了:您可能需要一个更复杂的网络才能获得更好的结果。

【讨论】:

  • 感谢您的详细回答。我仍然是神经网络的新手,这是我的第一个实现。我会尝试将您所说的内容合并到我的代码中。有什么特别的资源可以用来进一步学习吗?
【解决方案2】:

与神经网络或您的代码无关, 但是这张 KNN 最近数字的图片显示了一些 MNIST 数字 简直难以辨认:

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2020-10-02
    • 2013-05-12
    • 2017-10-12
    • 2017-06-19
    • 1970-01-01
    相关资源
    最近更新 更多