0 前言
Resnet一般用于图像分类问题,它是一种残差网络,其实是从VGG发展而来,可以解决传统网络深度加深而出现的损失增加问题,其实本质也是CNN的一种变种。为什么叫残差网络呢,我们来看下图:
![](https://img.haomeiwen.com/i12070706/8ef952b3dc58f27b.png)
假设有输入X,这是个张量,三维四维都有可能的,经过某一层网络后有一个输出H(X),神经网络的训练过程就是要学习这个H(x)。
但是从残差网络的图我们可以看出来,残差网络多了一个identity mapping过程,名字起得还挺好,其实就是把这一层的输入不做任何处理直接加到这层网络的输出上。当然经过卷积层的输入输出维度可能有变化,他自己有个采样方法,可以保证维度一致的。方法有两种:直接补0或者采用1×1卷积。
这样的话残差网络实际上学习的是H(X)-X,这也是它名字的来源。
1.Resnet原理
这里我们关注它是怎么具体实现的。
1.1关键组成
-
residual block/bottleneck模块
残差网络是由一个个residual block构成的,但为了计算方便,Resnet的作者提出来了bottleenck模块。
Resnet模块示意图
上面这个图呢,左边就是传统的连接方式,通过两个卷积网络,得到最后的输出,然后再加上残差。这样做的缺点就是参数太多了,在网络很深的时候,计算量就变大了,于是有人提出了bottleneck,可以有效减少参数量。
bottleneck包括两个1×1的卷积核,关于这个卷积核的作用,有以下几种说法:
(1)升维和降维,比如64的最后成功映射到256
(2)增加非线性,使网络拟合效果更好
(3)减少计算量 -
BN模块
BN是Batch Normalization,在进行深度网络的构建的时候一般都会用到这一个模块,主要是在梯度下降算法过程中,我们要花很多时间去调参,比如学习率,dropout比率等等。相比之下,BN就好多了:
(1)最好的一点,可以不要dropout和L2正则
(2)可以选择一个较大的学习率,使训练很快收敛
这一层的目的是对数据做一个标准化的处理,可能会改变数据原有的分布情况。比如说上一层学完的数据大部分都大于0,经过Relu这层函数之后,大于0的被激活,强制来个归一化,可能会影响数据的激活效果。这个时候,有人提出了可学习的参数:
归一化方法
- Relu模块
Relu就是0-1激活层。
通过以上几个模块的摆放我们就能得到不同结构的Resnet。
1.2 常见Resnet的结构
下面这个图是VGG19、34层深度神经网络还有34层残差网络的一个结构图。可以看出来Resnet的深度是加深了,但是由于加上了残差项,很好地避免了梯度消失和网络失效的问题。那个实线就是输入和残差直接相加,因为维度是一样的,虚线就是把维度处理以后再相加。
![](https://img.haomeiwen.com/i12070706/f8e1c7d01de3bbb6.png)
我觉得理解起来还是没有什么难度的,不知道大家觉得怎么样。根据层数的不同Resnet可以分为18、34、50、101、152几种。
![](https://img.haomeiwen.com/i12070706/2cf2ade920044b92.png)
不难发现吧,超过50层的都用了bottleneck结构。具体的不多说了,自己看吧。
1.2 不同残差块的组成情况
传统的残差网络一个模块是下面这个图这样的,输入进来以后卷积,BN标准化,再激活,再卷积再BN标准化,然后和原始输入加起来以后,再做一次激活。
![](https://img.haomeiwen.com/i12070706/b4212e1fc3ece9a8.png)
这里有很多激活函数不同位置的案例,但是大家做的时候,就先照着标准的来就行了。
![](https://img.haomeiwen.com/i12070706/cfde3d1b4cd2827f.png)
网友评论