使用Sigmoid Activation函数训练MNIST数据集

时间:2016-11-26 08:02:50

标签: python matrix scipy neural-network mnist

根据this tutorialPythonNumpy,我希望将MNIST数据集训练到可以识别手写数字的神经网络。我理解逻辑,但我现在有一个问题。

在本教程中,测试用例为AND逻辑门,由于数据量较少,因此工作正常。但我使用的是MNIST数据库,每张图片都有28*28维度,当我将每个图片转换为向量时,我有N*784矩阵。如果我有784*1矩阵作为weight matrix,当我将它与输入矩阵相乘时,得到的数字将是非常小或非常大的数字(负数或正数),因为我使用{ {1}}激活功能,我的所有数据在第一个学习周期分为两个部分,1和0,但我需要收集缓慢的小数字。

例如,我在乘法后获得这些数字:Sigmoid-569.87541502,第一个在218.62477264激活函数中为0,第二个为1,并且没有培训空间和融合。所有这一切都是因为大量的数据导致这些数据的总和或非常小。

我使用这个技巧来产生比原始教程非常小的权重,但我得到相同的结果(我在想,因为这些是小数字,它们的总和可能非常大但我得到相同的结果) :

Sigmoid

我不知道如何克服这一点。

1 个答案:

答案 0 :(得分:1)

解决方案:

确保预处理您的输入。

如果输入像素在[0,255]范围内,最好将它们重新缩放为[0.0,1.0]。这在大多数情况下都足够了。

更高级的方法是使用batch normalization

确保以标准化方式初始化权重矩阵。

通过归一化,我的意思是权重矩阵的784维列向量中的每一个都应该具有固定的L2范数。对于简单的设置,您可以将它们标准化为1。

权重矩阵初始化是一个研究课题,例如使用glorot initialization往往会为深层网络显示更好的结果。