MNIST - 训练卡住
MNIST - Training stuck
我正在阅读 Neural Networks and Deep Learning(前两章),我正在尝试继续并构建我自己的 ANN 来对 MNIST 数据集中的数字进行分类。
我已经摸不着头脑好几天了,因为我的实现在 10 个时期后对测试集(大约 5734/10000)中的数字进行分类时准确率达到 57% 的峰值(训练集的准确率停滞不前)在第 10 个 epoch 之后,测试集的准确性可能由于过度拟合而恶化)。
我使用的配置与书中几乎相同:2 层前馈 ANN (784-30-10),所有层都完全连接;标准 sigmoid 激活函数;二次代价函数;权重以相同的方式初始化(取自均值为 0 且标准差为 1 的高斯分布)
唯一的区别是我使用的是在线培训而不是 batch/mini-batch 培训,学习率为 1.0 而不是 3.0(尽管我尝试过小批量培训 + 学习率为 3.0)
然而,我的实现在一系列时期后没有通过 60% 百分位数,正如书中所述,ANN 在 第一个时期之后超过 %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 = derivative wrt weight, db = derivative wrt bias):
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 问题时遇到过这个问题?
甚至对我应该检查的事情的建议也会有所帮助,因为我真的迷路了。
多哈..
事实证明我的反向传播实现没有任何问题...
问题是我将图像读入一个带符号的字符(在 C++ 中)数组,像素值溢出,所以当我除以 255.0 将输入向量归一化到 0.0-1.0 的范围内时,我实际上得到负值...;-;
所以当问题完全出在其他地方时,基本上我花了大约四天时间调试和重新实现相同的东西。
我正在阅读 Neural Networks and Deep Learning(前两章),我正在尝试继续并构建我自己的 ANN 来对 MNIST 数据集中的数字进行分类。
我已经摸不着头脑好几天了,因为我的实现在 10 个时期后对测试集(大约 5734/10000)中的数字进行分类时准确率达到 57% 的峰值(训练集的准确率停滞不前)在第 10 个 epoch 之后,测试集的准确性可能由于过度拟合而恶化)。
我使用的配置与书中几乎相同:2 层前馈 ANN (784-30-10),所有层都完全连接;标准 sigmoid 激活函数;二次代价函数;权重以相同的方式初始化(取自均值为 0 且标准差为 1 的高斯分布) 唯一的区别是我使用的是在线培训而不是 batch/mini-batch 培训,学习率为 1.0 而不是 3.0(尽管我尝试过小批量培训 + 学习率为 3.0)
然而,我的实现在一系列时期后没有通过 60% 百分位数,正如书中所述,ANN 在 第一个时期之后超过 %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 = derivative wrt weight, db = derivative wrt bias):
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 问题时遇到过这个问题? 甚至对我应该检查的事情的建议也会有所帮助,因为我真的迷路了。
多哈..
事实证明我的反向传播实现没有任何问题...
问题是我将图像读入一个带符号的字符(在 C++ 中)数组,像素值溢出,所以当我除以 255.0 将输入向量归一化到 0.0-1.0 的范围内时,我实际上得到负值...;-;
所以当问题完全出在其他地方时,基本上我花了大约四天时间调试和重新实现相同的东西。