为什么我的神经网络在MNIST数据集上训练不能正确预测7和9?

时间:2015-09-14 12:56:46

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

我使用Matlab(github code repository)。网络的细节是:

  • 隐藏单位:100(变量)

  • 时代:500

  • 批量大小:100

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

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

然而,7,9无法识别,但在测试集上运行时,我只得到749/10000错误,并且正确地将9251/10000分类。

知道可能出错的是什么?因为它是学习的,并且基于测试集的结果,它正确地学习。

2 个答案:

答案 0 :(得分:2)

我的代码中没有看到任何完全不正确的内容,但有很多内容可以改进:

  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. 您在评论中说网络没有检测到您自己的七人制和九人制。这可能表明对MNIST数据的过度拟合。要解决此问题,您需要在网络中添加某种形式的正规化:重量衰减或辍学。

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

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

  6. MNIST是一个大数据集,其中仍在研究更好的算法。您的网络非常基本,小巧,没有正规化,没有偏置神经元,也没有经典梯度下降的改进。这并不奇怪,它运作得不好:你可能需要一个更复杂的网络来获得更好的结果。

答案 1 :(得分:0)

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

enter image description here