由之前的研究,会有人疑问是否往往更深层次的神经网络具有更佳的表现?这种问题现在还无法进行完美的解答。
但在尝试进行更深层次的神经网络时,网络性能不一定会得到显著的提升,反而训练和测试的性能有时会下降。这是由于网络结构变深,每一层的求导结果是要参考上一层的结果,因此层层累计的误差会随着层数的增多而急剧增大,进而造成更严重的梯度离散和梯度爆炸的现象。
因此我们希望更多层数的神经网络至少不差于低层次的神经网络结构。
如上图所示,我们新创建的30layers的网络结构在性能上最起码不要差于22层的googlenet。因此我们考虑在22层结束末尾添加一个short cut(捷径),这里对loss的求导为1,因此若此时的训练效果不好,神经网络则会直接跨过后面的8层。若结果尚可,则会进行30层的学习。因此short cut的建立可以保障即便训练效果再差,也会优于22层的网络结构。
注意这里的short cut不是每一层都加,而是每隔数层之后再加。
如上图所示,ResNet是由一个个类似于上面的小单元堆叠而成。
正常情况下单元的构成包括有:(conv)卷积层+batch norm+pooling+ReLU,而ResNet的构成可能大部分为conv+ReLU+conv+ReLU层组成。
后人经过探索发现,小单元的构造最佳为2至3层的卷积层再加一个short cut较合适。
上图中,假设输入的是256,为能进行相加,因此输出的shape也必须为256。因此卷积的操作不能进行维度上的衰减。
这样每个小单元的参数量大概为256*256*3*3(kernel shape)≈600K左右。
为能进行更好的训练,这里可以对kernel的size进行减小,可以变为[64, 224, 224],后续进行padding操作后变为[64, 224, 224],再往后变为[256, 224,224]。此时总输出约为70K。数据量明显减小。
对比一下各个网络层的结构
上图中,VGG结构的空白部分代表了在ResNet中可替换的short cut层。
此时有的人会有疑问,若在每一层都加short cut,那么整个结构会不会退化成只有一层的结构。其实是否退化是由网络结构的训练过程决定的。
可以说,若果以后硬件性能变得更强,则ResNet与VGG可能会变成深度学习发展的中间产物,但可以确定的是暂时两者的使用还是很广的。
ResNet一经推出便取得了优异战果
在检测、定位、语义分割等多领域都取得较好效果。每一项的提升都很显著。
本文分享自 python pytorch AI机器学习实践 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!