【问题标题】:Training MNIST dataset with Sigmoid Activation function使用 Sigmoid 激活函数训练 MNIST 数据集
【发布时间】:2016-11-26 08:02:49
【问题描述】:

根据this tutorial,用PythonNumpy,我想将MNIST数据集训练成可以识别手写数字的神经网络。我理解逻辑,但我现在有问题。

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

例如,我在乘法后得到这些数字:-569.87541502218.62477264Sigmoid 激活函数中的第一个是 0,第二个是 1,没有训练和收敛的空间。所有这一切都是因为大量的数据将它们相加产生了如此大或非常小的数字。

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

syn0 = (2*np.random.random((784,10))-1)*(0.00000005-0.00000001) + 0.00000001

我不知道我该如何克服。

【问题讨论】:

    标签: python matrix scipy neural-network mnist


    【解决方案1】:

    解决方案:

    确保预处理您的输入。

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

    更高级的方法是使用batch normalization

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

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

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

    【讨论】:

    • glorot初始化有没有python实现?
    • @Fcoder 很简单,列向量乘以sqrt(6./(in_dims+out_dims))
    • 谢谢,in_dims 和out_dims 是什么意思?现在我通过随机方法创建权重矩阵。你的解决方案是什么,我无法理解。我是这个主题的新手,很抱歉有很多问题。
    • @Fcoder 特定层的输入和输出维度,在这种特殊情况下只是权重矩阵的列/行维度。目标是使用标准正常 dist 进行初始化,然后重新缩放。
    • 谢谢,我这样做了: syn0 = np.dot(syn0, np.sqrt(6./(7840+59580))) 。但同样,当我将输入与权重相乘时,我得到大量数字,它们在 sigmoid 函数中都是 1 或 0,并且网络无法学习任何东西。像这样的数字: 77998.9275072 , -81295.10915719 , -78033.05164159
    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 2019-05-04
    • 2021-03-23
    • 2019-04-25
    • 2018-04-15
    • 2020-12-05
    • 2016-07-17
    • 2015-04-21
    相关资源
    最近更新 更多