【问题标题】:MNIST - Training stuckMNIST - 训练卡住
【发布时间】:2016-03-22 02:43:09
【问题描述】:

我正在阅读Neural Networks and Deep Learning(前两章),我正在尝试跟随并构建自己的 ANN 来对 MNIST 数据集中的数字进行分类。

我已经摸不着头脑好几天了,因为我的实现在 10 个 epoch 后对测试集(约 5734/10000)中的数字进行分类时达到了约 57% 的准确率(训练集的准确度在第 10 个 epoch,测试集的准确率可能会因为过度拟合而下降)。

我使用的配置与书中几乎相同:2 层前馈 ANN (784-30-10),所有层都完全连接;标准 sigmoid 激活函数;二次成本函数;权重以相同的方式初始化(​​取自均值为 0,标准差为 1 的高斯分布) 唯一的区别是我使用在线训练而不是批量/小批量训练,学习率为 1.0 而不是 3.0(我尝试过小批量训练 + 学习率为 3.0)

然而,我的实现在一堆 epochs 之后没有通过 60% 的百分位,正如书中所说,ANN 在第一个 epoch 之后就超过了 %90,具有几乎完全相同的配置。 一开始我搞砸了反向传播算法的实现,但是在以不同的方式重新实现了 3 次反向传播之后,每次重新实现的结果完全相同,我被难住了......

反向传播算法产生的结果示例:

使用与上述相同配置的更简单的前馈网络(在线训练 + 学习率为 1.0):3 个输入神经元、2 个隐藏神经元和 1 个输出神经元。

初始权重初始化如下:

Layer #0 (3 neurons)

Layer #1 (2 neurons)
  - Neuron #1: weights=[0.1, 0.15, 0.2] bias=0.25
  - Neuron #2: weights=[0.3, 0.35, 0.4] bias=0.45

Layer #2 (1 neuron)
  - Neuron #1: weights=[0.5, 0.55] bias=0.6

给定输入 [0.0, 0.5, 1.0],输出为 0.78900331。 对相同的输入进行反向传播,期望的输出为 1.0,得到以下偏导数(dw = wrt wrt 的导数,db = wrt 的导数偏差):

Layer #0 (3 neurons)

Layer #1 (2 neurons)
  - Neuron #1: dw=[0, 0.0066968054, 0.013393611] db=0.013393611
  - Neuron #2: dw=[0, 0.0061298212, 0.012259642] db=0.012259642

Layer #2 (1 neuron)
  - Neuron #1: dw=[0.072069918, 0.084415339] db=0.11470326

使用这些偏导数更新网络会产生 0.74862305 的校正输出值。


如果有人愿意确认上述结果,那将极大地帮助我,因为我几乎排除了反向传播错误是问题的原因。

处理 MNIST 问题的人是否遇到过这个问题? 甚至对我应该检查的事情的建议也会有所帮助,因为我真的迷路了。

【问题讨论】:

    标签: neural-network artificial-intelligence backpropagation mnist feed-forward


    【解决方案1】:

    呵呵..

    结果证明我的反向传播实现没有任何问题......

    问题是我将图像读入有符号字符(在 C++ 中)数组,并且像素值溢出,所以当我除以 255.0 以将输入向量归一化到 0.0-1.0 范围内时,我实际上得到了负值... ;-;

    所以当问题完全出在其他地方时,我基本上花了四天时间调试和重新实现相同的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 2016-06-08
      • 1970-01-01
      • 2019-09-29
      • 2020-08-03
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      相关资源
      最近更新 更多