Resnet原理以及更改学习率的实验效果

本文将简单讲述resnet的原理以及实验结果。

论文名称:Deep Residual Learning for Image Recognition

这一篇论文可以算的上是神经网络的最经典的论文了,resnet的结构十分容易实现,而且效果非常的好,几乎之后所有的GAN里面神经网络结构都有resnet的身影。

目录

1.网络原理

2.网络结构

3.实验结果

4.更改学习率对网络的影响


1.网络原理

首先论文指出了一个让人比较疑惑的问题,较深的网络训练效果不如浅的网络如下图

上图中56层的网络无论是训练错误率还是测试的错误率都是比20层的多,由此可见简单的增加网络的深度并不能提高训练的精度,引起此现象并不是因为过拟合造成的,而是因为反向传播导数的关系。 论文中给出了解决的方法那就是残差网络,结构如下图。

网络结构很简单就是H(x)=F(x)+x 其中x是输入,F(x)是经过卷积层的输出,两者相加(特征图方面的相加不是进行cat操作)就是最终的输出。这个公式也可以换个角度去理解:假如没有残差网络的话我直接使用x放入卷积层中进行计算来得到H(x),如果加入残差网络也就是resnet的话,x进入神经网络得到F(x)也就等同与H(x)-x,在与x相加得到H(x)。

至于这个结构为什么会有效果,李沐老师也给出了数学的证明如下图。

 首先y是当前卷积层的输入,与y*=g(f(x))是经过卷积之后的结果,y**是两者相加的结果,之后进行反向求导的话可以看出来y**的导数等于y的导数加上y*的导数,而且y*的导数也和y的导数有关,也就是说如果经过卷积层的导数很小的话,对网络起不到更新的作用,但是我加入了输入的导数,也就保证了我的网络导数会一直存在,而不会出现导数消失的情况。这也就是resnet为什么会好用的原理,就是保证网络反向传播的时候导数一直会存在。

2.网络结构

网络结构如下图

 首先论文给出了5种结构层数如上图所示

1.50层以上的网络与18和34层的结构略微不同。

2.34层的参数量是18层的两倍,但是50层参数量几乎和34层的相同,是因为用了不同的结构。

3.图中的乘2或者乘4是代表这有几个相同的块,块的内容如下图所示。

 左边的是18和34的块就是两个简单卷积层构成,右边的是层数高的网络使用的也就是50层以上,简单介绍一下,加入当前x有256个特征图,为了减少运算,我先使用1*1的卷积层来把通道数降下来,在用3*3的卷积层进行计算,在使用一个1*1的卷积层在还原到256个通道。很明显34和50层的网络进行对比,计算量确实大幅度减少。

3.实验结果

 首先左边的图是没有加入resnet的网络,右面是加入resnet的网络。

1.一开始的训练损失大于测试损失,可能是数据造成的。

2.18层的网络是34层的子结构,在加了不是太多层的情况下,我觉得34的效果应该好于18层的?但是加入了残差之后34反而比18的效果好。论文也指出在训练更多轮也会有这个问题,有可能是因为调参的问题。

3.加入残差之后收敛速度变快了,验证了文章的说法学习F(X)比直接学H(X)容易一些。

4.两次比较快的下降是因为更改了学习率。

总结:

1.未加入resnet的神经网络18层好于34层,加入resnet的网络34好于18层。

2.加入resnet18和不加入resnet18效果差不多,但是未加入resnet18的网络效果出奇的好。

4.更改学习率对网络的影响

接下来是本人做的一些实验,首先是学习率改变的方法使用的方法是:等间隔调整学习率 StepLR。举个例子在实验中前60轮的学习率是0.1,之后设置一个参数gamma=0.2,在60到120轮的学习率是0.1*gamma=0.02,在120到150轮就是0.02*gamma=0.004以此类推,之后轮数和gamma都是自己提前设置的。接下来就是实验结果。未加入resnet的网络简称plain。用的是cifar-100数据集。

resnet34(更改学习率的训练损失)

resnet34(测试正确精度)

 

 resnet34(未改变学习率)

 resnet34(精度)

 

 resnet18(改变学习率)

 

 resnet18(不改变学习率)

 

 plain18

 

 plain34

 

 上面是自己做的实验,与论文结果基本相同,但是注意一点训练损失下降并不是因为改变了学习率损失才会下降,我的意思就是说,假如有可能一开始就用小学习率比如0.004或者0.0008可能也会达到相同的效果,只不过会比较慢罢了。

猜你喜欢

转载自blog.csdn.net/qq_45710342/article/details/124830570