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

Why does my neural network trained on MNIST data set not predict 7 and 9 correctly?

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

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

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

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

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

我没有发现您的代码有任何完全错误的地方,但有很多地方可以改进:

  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]中生成随机数。然后您可以尝试除以该间隔以获得更小的权重(尝试除以大小的平方)。

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

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

    如果使用平方损失函数,则乘以导数即可。对于对数损失(通常用于分类),你应该只有 outputVector - targetVector。这可能不会有太大的不同,但您可能想尝试一下。

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

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

  5. 你似乎没有任何偏见神经元。每一层,除了输出层,都应该有一个只returns值1到下一层的神经元。您可以通过向始终为 1.

  6. 的输入数据添加另一个功能来实现此目的

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

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