我正在使用 Matlab (github code repository)。网络的详细信息是:
隐藏单位:100(可变)
纪元:500
- 批量大小:100
权重正在使用反向传播算法进行更新。
我已经能够识别我在 Photoshop 中绘制的 0,1,2,3,4,5,6,8。
然而,7,9 未被识别,但在测试集上运行时,我只得到 749/10000 错误,并且它正确分类了 9251/10000。
知道可能出了什么问题吗?因为它正在学习并且基于测试集,所以它的学习正确。
最佳答案
我在您的代码中没有发现任何完全错误的地方,但还有很多可以改进的地方:
您可以使用它来设置初始权重:
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 是一个大数据集,仍在研究更好的算法。您的网络非常基本,很小,没有正则化,没有偏差神经元,也没有对经典梯度下降的改进。它运行得不太好并不奇怪:您可能需要更复杂的网络才能获得更好的结果。
关于matlab - 为什么我的神经网络在 MNIST 数据集上训练后无法正确预测 7 和 9?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32565438/