使用 Sigmoid 激活函数训练 MNIST 数据集
Training MNIST dataset with Sigmoid Activation function
根据 this tutorial,使用 Python
和 Numpy
,我想将 MNIST
数据集训练成可以识别手写数字的神经网络。我理解逻辑,但我现在有问题。
本教程中的测试用例是 AND
逻辑门,由于数据量小,它运行良好。但是我正在使用 MNIST
数据库并且每个图像都有 28*28
维度,当我将它们中的每一个转换为矢量时,我有 N*784
矩阵。如果我有一个 784*1
矩阵作为 weight matrix
,当我将它与输入矩阵相乘时,结果数字将非常小或非常大(负或正),因为我使用 Sigmoid
激活函数,我所有的数据在第一个学习周期分为两部分,1 和 0,但我需要小数字,收敛速度慢。
例如,我在乘法后得到这些数字:-569.87541502
,218.62477264
,第一个在 Sigmoid
激活函数中为 0,第二个为 1,并且没有空间用于训练和收敛。所有这一切都是因为大量的数据,它们的总和导致了如此大或非常小的数字。
我使用这个技巧来生成比原始教程小的权重,但我得到了相同的结果(我在想,因为这些都是小数字,它们的总和不会很大,但我得到了相同的结果) :
syn0 = (2*np.random.random((784,10))-1)*(0.00000005-0.00000001) + 0.00000001
我不知道该如何克服。
解决方案:
确保预处理您的输入。
如果您的输入像素在 [0, 255] 范围内,最好将它们重新调整为 [0.0, 1.0]。这在大多数情况下就足够了。
更高级的方法是使用 batch normalization。
确保以标准化方式初始化权重矩阵。
所谓归一化,是指权重矩阵的784维列向量中的每一个都应该有一个固定的L2范数。对于简单的设置,您可以将它们标准化为 1。
权重矩阵初始化是一个研究课题,例如使用 glorot initialization 往往会为深度网络显示更好的结果。
根据 this tutorial,使用 Python
和 Numpy
,我想将 MNIST
数据集训练成可以识别手写数字的神经网络。我理解逻辑,但我现在有问题。
本教程中的测试用例是 AND
逻辑门,由于数据量小,它运行良好。但是我正在使用 MNIST
数据库并且每个图像都有 28*28
维度,当我将它们中的每一个转换为矢量时,我有 N*784
矩阵。如果我有一个 784*1
矩阵作为 weight matrix
,当我将它与输入矩阵相乘时,结果数字将非常小或非常大(负或正),因为我使用 Sigmoid
激活函数,我所有的数据在第一个学习周期分为两部分,1 和 0,但我需要小数字,收敛速度慢。
例如,我在乘法后得到这些数字:-569.87541502
,218.62477264
,第一个在 Sigmoid
激活函数中为 0,第二个为 1,并且没有空间用于训练和收敛。所有这一切都是因为大量的数据,它们的总和导致了如此大或非常小的数字。
我使用这个技巧来生成比原始教程小的权重,但我得到了相同的结果(我在想,因为这些都是小数字,它们的总和不会很大,但我得到了相同的结果) :
syn0 = (2*np.random.random((784,10))-1)*(0.00000005-0.00000001) + 0.00000001
我不知道该如何克服。
解决方案:
确保预处理您的输入。
如果您的输入像素在 [0, 255] 范围内,最好将它们重新调整为 [0.0, 1.0]。这在大多数情况下就足够了。
更高级的方法是使用 batch normalization。
确保以标准化方式初始化权重矩阵。
所谓归一化,是指权重矩阵的784维列向量中的每一个都应该有一个固定的L2范数。对于简单的设置,您可以将它们标准化为 1。
权重矩阵初始化是一个研究课题,例如使用 glorot initialization 往往会为深度网络显示更好的结果。