我使用Matlab(github code repository)。网络的细节是:
隐藏单位:100(变量)
时代:500
使用反向传播算法更新权重。
我已经能够识别我在photoshop中绘制的0,1,2,3,4,5,6,8。
然而,7,9无法识别,但在测试集上运行时,我只得到749/10000错误,并且正确地将9251/10000分类。
知道可能出错的是什么?因为它是学习的,并且基于测试集的结果,它正确地学习。
答案 0 :(得分:2)
我的代码中没有看到任何完全不正确的内容,但有很多内容可以改进:
您可以使用它来设置初始权重:
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)。
您可以将此作为输出增量:
outputDelta = dactivation(outputActualInput).*(outputVector - targetVector) % (tk-yk)*f'(yin)
如果使用平方损失函数,则乘以导数。对于日志丢失(通常是分类中使用的日志丢失),您应该只有outputVector - targetVector
。它可能没有那么大的差别,但你可能想尝试。
您在评论中说网络没有检测到您自己的七人制和九人制。这可能表明对MNIST数据的过度拟合。要解决此问题,您需要在网络中添加某种形式的正规化:重量衰减或辍学。
如果你还没有,你也应该尝试不同的学习率。
你似乎没有任何偏见神经元。除输出图层外,每个图层都应该有一个仅将值1
返回到下一层的神经元。您可以通过向输入数据添加另一个始终为1
的功能来实现此功能。
MNIST是一个大数据集,其中仍在研究更好的算法。您的网络非常基本,小巧,没有正规化,没有偏置神经元,也没有经典梯度下降的改进。这并不奇怪,它运作得不好:你可能需要一个更复杂的网络来获得更好的结果。
答案 1 :(得分:0)