2

我正在阅读《神经网络和深度学习》(前两章),我正在尝试跟随并构建自己的 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 权重,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 问题遇到过这个问题?甚至对我应该检查的事情的建议也会有所帮助,因为我真的迷路了。

4

1 回答 1

3

呵呵..

事实证明我的反向传播实施没有任何问题......

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

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

于 2015-12-17T21:57:08.503 回答