前言
在前篇vgg16之后,无法成功训练vgg16,发现是自己电脑可用的显存太低了,遂放弃。
在2015 ILSVRC&COCO比赛中,何恺明团队提出的Resnet网络斩获第一,这是一个经典的网络。李沐说过,如果要学习一个CNN网络,一定是残差网络Resnet。与VGG相比,Resnet则更加出色,为后续的研究做下铺垫
这是Resnet论文翻译参考链接:
在之前的神经网络,存在两个问题:
- 网络收敛速度很慢,在用vgg16训练做cifar分类的时候,收敛速度很慢,与resnet相比,收敛速度慢至几倍甚至十倍。而且一旦出现梯度爆炸或者梯度消失,则会影响网络的收敛
- 随着网络的加深,准确率达到饱和,然后开始下降。这称之为退化。
- 从上面这幅图可以看出,在一定的训练迭代中,适合的浅层网络要比深层网络有更低的训练误差和测试误差
Resnet在当时打破了网络越深,性能越好的共识,而且残差结构能加速学习,使得模型更加容易学习,也能有效地防止梯度爆炸或者消失。
为什么残差网络更容易学习特征?
- 从论文中可以看出,Resnet网络没有使用Dropout,而是利用了Bn层和平均池化层进行正则化,有效加快训练。
- 使用很少的池化层,间接加快训练
- 残差结构能够减少学习压力,在学习过程中,可以通过Shortcut连接学习冗余度比较高的地方,整体看,网络不再依赖整个映射,因此能够学习地更好。
- 还有一个可能,Resnet就像是集成学习,将每一个残差模块以某种加权方式学习起来。该观点属于猜测,写下来是为了做个标记,在未来可以根据资料印证。
区分退化和过拟合:
退化:指的是网络深度增加,网络准确度出现饱和,甚至出现下降
过拟合:指的是网络在训练集训练的很好,但是在未知的测试集表现地很差
下图是Resnet系列,包括Resnet18、Resnet34、Resnet50、Resnet101、Resnet152


在keras中没有找到Resnet18的网络,所以本次复现的是Resnet18,如果有问题,请联系我。本次我根据一些帖子以及pytorch的源码去核对我复现的版本,复现的代码参照了keras源码。
代码
Resnet18
下图是plot_model函数保存下来的Resnet18网络结构,欢迎大家指出问题

训练
这次依旧训练cifar10,将cifar10分成训练集、验证集、测试集。接下来贴代码,本次训练和上篇vgg16一样,大家可以参照上一篇。按照其他大佬的经验,在不大修改模型的情况下,按照比赛的记录,测试的结果应该在85%+。
训练结果:总共训练了20个epoches,但是在第15-18个epoches时,模型达到比较优秀的结果
接下来 我们取其中第16个epoches做测试,得到结果,准确率大概在88%
补充,其实还有一种方式可以画出keras的结构图。而且是网页版的
https://netron.app/
结果模型我已经放在云盘 欢迎大家下载测试
https://url25.ctfile.com/f/--23a4e6 (访问密码:3005)


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/166882.html