我正在阅读Neural Networks and Deep Learning(前两章),我正在尝试跟进并构建我自己的ANN来对MNIST数据集中的数字进行分类。
我已经抓了好几天了,因为我的实施在10个时期后对测试集(一些5734/10000)的数字进行分类时达到了约57%的准确度(训练集的准确性停滞不前)在第十个时期之后,测试集的准确性可能因为过度拟合而恶化。
我使用与书中几乎相同的配置:2层前馈ANN(784-30-10),所有层完全连接;标准sigmoid激活函数;二次成本函数;权重以相同的方式初始化(取自平均值为0且标准差为1的高斯分布) 唯一的区别是我使用在线培训而不是批量/小批量培训,学习率为1.0而不是3.0(我尝试过小批量培训+ 3.0的学习率)
然而,我的实现并没有超过60%的百分位数,因为在本书中人工神经网络在第一个时期之后超过%90时几乎完全相同的配置< / em>的。 起初我搞砸了实现反向传播算法,但是在重新实现反向传播三次之后,在每次重新实现时得到的结果完全相同,我感到很难......
反向传播算法产生的结果示例:
使用上述相同配置的简单前馈网络(在线训练+学习率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。
如果有人能够确认上述结果,那将对我有很大的帮助,因为我几乎排除了反向传播作为问题的原因。
有没有人遇到过这个问题? 甚至对我应该检查的事情的建议也会有所帮助,因为我真的迷失了。
答案 0 :(得分:3)
Doh ..
事实证明我的反向传播实施没有错...
问题在于我将图像读入带符号的char(在C ++中)数组中,并且像素值溢出,因此当我除以255.0以将输入向量标准化为0.0-1.0的范围时,我实际上得到了负值...; - ;
所以基本上我花了四天时间调试并重新实现同样的问题,当问题完全出现在其他地方时。