mnist precision尝试到97%:
在做stanford mnist提高accuracy作业时候,尝试修改参数的总结,只用了全连接
1.增加了epochs次数, loss,precision都有一定的提高, loss从0.3到0.243, precision从0.89到0.9246, 可是之后再增加epochs却没什么效果。
2.尝试了加了一层中间层,却没有precision任何提高,loss也没减少。后发现
上一层的信号(也就是wx+b算出的结果)要作为下一层的输入,但是这个上一层的信号在输入到下一层之前需要一次激活f = sigmoid(wx+b),因为并不是所有的上一层信号都可以激活下一层,如果所有的上一层信号都可以激活下一层,那么这一层相当于什么都没有做。
3.想着加些非线性,应该能提高, 实际使用了relu: 加入了稀疏性,确实是非线性的,之前认为和非线性关系不大。 效果很显著,网络迅速收敛,loss 达到了0.0117, precision达到了0.9798。这个结果是基于中间层+relu。感觉在最后一层relu不是很合理,实际测试结果也确实如此。
所以,结构是 fully-connected, relu, fully-connected +softmax
神经元个数随意设置的
nmnist precision test dataset到了 95%, train set 99%
使用和mnist一样的结构,precision确实下降了到80%几,数据集难些:
1.尝试使用了Adam optimizer, 收敛速度确实快了, loss也更小了些, precision有一定提高
2.尝试三层网络,直接加了一层全连接+relu,发现loss反而收敛的不好,感觉三层不容易收敛。
3.尝试三层再添加dropout层,没有什么效果,dropout或许对过拟合效果很好,对于提高更好的收敛,没有太大帮助(感觉), 用的时候loss跳得很厉害,猜测这是由于输入分布不稳定导致的,不好收敛。在加入batchnorm后再用,就不跳动了。
4.后增加了batchnorm,帮助收敛(归一化的神奇功效,稳定每层的输入分布),确实提高了不少,训练集直接提高到98,99%, 测试集也在95%以上, 两层网络依旧比三层网络性能好一些,没想出理由。
5.尝试减少每层神经元个数,能保持准确率,训练速度快了很多,但是再减少发现收敛速度就开始降低了。
6.使用了L2正则化, 有效果,在尝试多个超参数值下验证集能达到94.69%,这里是两层网络+relu, 中间层有1024个神经元
7.尝试了四层网络没加batchnorm,测试集精度有93.26,训练集87.3 ? 这并不是过拟合, loss也有0.4,感觉没有收的很好, 还是要batchnorm
8.尝试使用了指数衰减的学习率和四层网络,没有使用batchnorm, 也达到了很好的结果,loss 0.03, traindataset precision99, testdataset 96%
9.尝试了2层卷积(stride 2)加两层全连接, 没有加别的, 收敛不了。
9.2改用pooling实现stride, 提高了几个百分点性能, 但是loss会起伏,不稳定整个过程。
9.3 加入batchnorm,收敛了
结论
0.1迭代次数增加能提高模型能力,但一定次数后就到瓶颈了。
0.2输入的归一化,是必须的,否则loss就要NA了(太大)或者难以收敛都有可能
1.relu是多层网络必需的一部分。
2.多层网络,batchnorm才能让网络更稳定,快速地收敛。
3.dropout使用的效果不明显,在目前使用情况下。然而L2效果不错
4.多层网络用batchnorm能帮助稳定收敛, L2有没有这个效果不知道,否则loss下降不了, 学习率的设置对深层网络影响蛮大的,可以再多测测。
输入用了pickle结构化,快。 加了validset,testset计算accuracy。
保存网络权重,结构, inference时候使用,以及对应api 之后再加上去, L2测试