2

我正在使用 Matlab( github 代码库)。网络详细信息如下:

  • 隐藏单位:100(可变)

  • 时代:500

  • 批量:100

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

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

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

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

4

2 回答 2

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 数据的过度拟合。为了解决这个问题,您需要在网络中添加某种形式的正则化:权重衰减或 dropout。

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

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

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

于 2015-09-14T13:33:37.497 回答
0

与神经网络或您的代码无关,但这张 KNN 最接近数字的图片表明,一些 MNIST 数字很难识别:

在此处输入图像描述

于 2016-04-28T16:23:11.963 回答