ResNet
本文对resnet进行介绍,文章目录如下:
- ResNet 历史
- ResNet 亮点
- 为何层数不能太深
- residual 残差模块介绍
- 网络结构
- BN 层
- 迁移学习
本文参考资料有:
- 6.1 ResNet网络结构,BN以及迁移学习详解
https://www.bilibili.com/video/BV1T7411T7wa
- ResNet原论文
https://arxiv.org/pdf/1512.03385.pdf
- Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
https://arxiv.org/abs/1502.03167
ResNet 历史
ResNet在2015年由微软实验室提出,在2015 ImageNet中分类任务第一,目标检测第一,COCO数据集目标检测第一,图像分割第一。
原论文如下:
ResNet 亮点
亮点主要有三点:
- ResNet采用了超深的网络结构,作者尝试了超过1000层的网络结构。
- 提出了residual模块。
解决退化问题
- 使用Batch Normalization加速训练,丢弃了dropout层。
解决梯度消失/梯度爆炸问题
为何层数不能太深
如果层数太深会引起梯度消失与梯度爆炸和退化问题。其中梯度消失指的是,假如你每次都乘以一个<1的数,由级数知识可知,最终结果会趋向于无穷,这个问题最终使用BN层消除了。还会引起退化问题,最终退化问题通过引入residual残差结构解决了。
residual 残差模块介绍
残差模块即特征矩阵相加,而对于深度更深的ResNet,作者通过使用1x1卷积核降维升维后,再进行特征矩阵的相加实现。两个特征矩阵要实现加法,需要保证两个特征矩阵的[channels, height, width]要相同。下图中,通过深度残差模块(右),我们能够明显地发现我们的网络所需要参数减少了。
网络结构
ResNet的模型结构见下表:
需要注意的是,每一个conv[n]_x(18,34浅层n>2,50,101,152深层n>1)
的第一个层都是虚线,需要对输入特征矩阵的大小进行变换,使其不等于输出特征矩阵大小。如果是实线的残差结构,则输出特征矩阵和输入矩阵是一样的,而对于虚线的残差结构捷径部分也是经过卷积处理的,输出特征矩阵往往不等于输出特征矩阵,如下:
BN 层
BN是解决过拟合的一种方式,BN全称Batch Normalization,它的目的是使每一批数据(batch)的每一层的feature map满足均值为0,方差为1的分布规律,在增加BN层后,在该BN层的前一层的Conv2d的bias参数得为False。
BN是google团队2015年论文”Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift"中提出,原论文链接https://arxiv.org/abs/1502.03167
,通过该方法能够加速网络的收敛并提升准确率。
我们对feature map输出特征矩阵的每一维度的数据求均值和方差,再通过标准化处理,缩放平移,得到最终的 y i y_i yi。缩放所使用的 β , γ \beta, \gamma β,γ是通过学习得到的。BN对于多维度的例子如下:
使用BN时需要注意以下三点:
- 训练时要将training参数设置为True,验证时要将training参数设置为False,pytorch中可以通过model.train()和model.eval()实现。
- batch_size要设置的尽量大,但是这个和硬件设备有关。
- 建议将BN层放在卷积层和激活层之间,且在卷积层不要设置bias,bias设置了也没用。
BN总结:
迁移学习
迁移学习指的是使用别人训练好的模型参数再进行训练,他的优势在于:
- 能够快速地训练出一个理想的结果。
- 当数据集较小的时候也能够训练出理想的效果。
使用迁移学习需要保证模型的全部参数或者某一部分参数是相同的。在对新的数据集进行训练时,往往低纬度的特征是通用的,而高维度的特征才是我们需要学习的,所以我们可以采用迁移学习对具有相同部分的新的网络或者新的数据集的高维度特征进行学习。
常见的迁移学习的方式具有以下几种:
- 载入权重后训练所有参数。(使用不同的数据集)// 效果最好
- 载入权重后只训练最后几层参数。(即全连接层中,你的分类个数可能不同)
- 载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层。(改变网络模型)
使用迁移学习,我们需要注意两个网络得有相同部分或完全相同才能迁移学习;要注意别人的预处理方式,保持自己的预处理方式与别人的预处理方式相同。