今天尝试用pytorch实现lenet,并完成mnist数据集手写数字分类。
先看lenet结构,第一层是卷积层,第二层是池化层,第三层是卷积层,第四层是池化层,第五层和第六层都是全连接层。每个卷积层后都紧跟一个池化层。
池化层的作用主要是通过下采样降低参数量。
我在测试时发现一个问题,卷积层和全连接层我都加了激活函数,池化层要不要加激活函数呢?如果池化层加上relu激活函数,测试精度为0.7,不加时精度为0.8。(样本量总共100,训练:测试=8:2,epoch=300)
为什么池化层加上激活函数后测试精度反而下降了呢?
我回想激活函数的作用,线性网络通过激活函数增加非线性能力,因为非线性模型能映射更复杂的现实世界,所以我们可以训练得到更强能力的模型。但是,事物具有双面性,更复杂的模型同时会带来一个问题,容易过拟合。
我有了一个假想:池化层加上激活函数后,又增加一层非线性映射,模型更加复杂,所以过拟合了,导致测试精度降低了?
我把疑问和假想告诉了明明老师,他的回答———
激活函数赋予网络非线性映射能力,可以更好把输入图片映射到输出。在一定范围内,激活函数堆叠的层数越多,模型能力相对越强,同时也更难训练一些。
加了激活函数反而更低了,可以试试多训练【多些epoch】,也可以换换激活函数试试。
lenet的池化层不用加激活函数。(比如层数上百的)大模型池化层也没有加激活函数。理论上需要加。但是咱们通常见到的模型,都没有加。我感觉还是实验的结果导向的。激活函数与卷积层配合,训练起来更快,总的来说更有效率。不过我还没有碰到文献上的支撑。
根据明明老师的解答,我的理解是———
出现我刚说的那种结果(池化层加上激活函数精度降低),可能是因为模型能力更强了,但是样本量只有80,迭代次数300也比较少,不能很好的训练模型。
所以,当模型能力越强时,越需要加大样本量和迭代次数等手段,加强模型的训练强度和能力,这样才能匹配强大的模型。就像,将军带兵,能力越强的将军,给他更多军队和艰难的任务,才能充分发挥大将军的威力。
这个问题很有趣,我在网上搜索,很少讨论池化层要不要加激活函数的问题,我想可能这个问题不是重点,所以很少有人关注,或者已成既定事实定论,日后有空再查查文献吧,万一是个研究点呢,哈哈