文章目录
一、什么是ResNet?
-
ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。
-
ResNet 网络中的两个核心组成部分
- 残差结构(Residual Structure)
- Batch Normalization(批归一化)
-
为什么要提出残差结构?
-
在ResNet 网络没有提出来之前,所有的神经网络都是通过卷积层和池化层的叠加组成的。
-
很多人认为卷积层和池化层的层数越多,模型的效果会越好
-
在实际的试验中发现,随着卷积层和池化层的叠加,学习效果不会逐渐变好,反而出现2个问题:
1.梯度消失和梯度爆炸
梯度消失:若每一层的误差梯度小于1,反向传播时,网络越深,梯度越趋近于0
梯度爆炸:若每一层的误差梯度大于1,反向传播时,网络越深,梯度越来越大2.退化问题
随着层数的增加,预测效果反而越来越差, 下面是何凯明他们论文中实验的可视化图,可以看出模型层数多的反而没有少的效果好
-
-
为了解决梯度消失或梯度爆炸问题,论文提出通过数据的预处理以及在网络中使用 BN(Batch Normalization)层来解决。
-
为了解决深层网络中的退化问题,可以人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为 残差网络 (ResNets)
-
ResNet论文提出了 residual结构(残差结构)来减轻退化问题,下图是使用residual结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,而是变的更好了
-
ResNet 网络有不同数量的网络层模型,下图为 ResNet18、ResNet34、ResNet50、ResNet101、ResNet152 网络的表格化结构图:
二、残差结构(Residual Structure)
-
如下图所示,残差块包含两条路径,一条是主路径(通常包含多个卷积层),用于提取特征;另一条是恒等快捷连接,允许输入直接跳过主路径的某些层与输出相加
-
所谓相加是特征矩阵相同位置上的数字进行相加
-
两条路径的输出在特征维度上需要保持一致,以便进行相加操作。这通常通过调整卷积层的步长(stride)、使用1x1卷积核进行升维或降维等方式来实现。
-
以ResNet 18网络为例:
- 下面是 ResNet 18网络完整的图形化结构图
- 下面是 ResNet 18网络完整的图形化结构图
-
部分残差块如下:
-
非残差结构-第一层时(左边结构):
-
经过卷操作得到输出为[56,56,64]:
- 通过设置步长stride=1、3x3卷积和卷积核64,使得高宽与卷积核不变
- 激活函数relu处理
- 通过设置步长stride=1、3x3卷积和卷积核64,重复特征提取
-
残差结构-第二层(右边结构):
-
由上一层的输入为[56,56,64]——>输出为[28,28,128]:
- 通过设置步长stride=2、3x3卷积和卷积核128,使得高宽从56缩减一半到28,卷积核从64个更改为128个
- 激活函数relu处理
- 通过设置步长stride=1、3x3卷积和卷积核128,重复特征提取
-
快捷连接的输入为[56,56,64]——>[1x1x128]——>输出为[28,28,128]:
- 通过设置步长stride=2、1x1卷积和卷积核更改,使得高宽从56缩减一半到28,卷积核从64个更改为128个。
- 与经过卷积层处理后的输出值相加
三、Batch Normalization(BN----批归一化)
-
所谓Feature Map(特征图)是卷积核卷出来的,你用各种情况下的卷积核去乘以原图,会得到各种各样的feature map。
-
在输入一张图片时往往会使用预处理来使得图片满足某一个分布规律,以加快特征提取。然后进行一次卷积得到一个feature map,而这个feature map就不一定还满足之前所要求的分布规律。
-
Batch Normalization是指批标准化处理,将一批数据的feature map满足均值为0,方差为1的分布规律。注意不是对某一张图片的feature map,而是一整批的feature map,因为BN需要计算整个batch的均值和方差。
-
如下图
-
原理
- 标准化处理:在训练过程中,对每个小批量数据进行标准化处理,即对每个特征维度进行归一化操作。这有助于缓解内部协变量偏移(Internal Covariate Shift)问题,即网络在训练过程中由于参数更新导致的数据分布变化问题。
- 可学习参数:为了恢复出原始网络所要学习的特征分布,BN引入了可学习的缩放因子(γ)和偏移因子(β),使得网络可以通过学习这些参数来调整标准化后的数据分布。
- 训练与测试:在训练阶段,BN使用当前小批量数据的均值和方差进行标准化处理;在测试阶段,则使用训练过程中所有小批量数据的均值和方差的移动平均进行标准化处理。
-
使用注意
-
(1)训练时要将traning参数设置为True进行统计,在验证时将trainning参数设置为False,对统计的值进行验证。在pytorch中可通过创建模型的model.train()和model.eval()方法控制。
-
(2)batch_size (每次迭代中,模型同时处理多少个数据点)尽可能设置大点,设置小后表现可能很糟糕,设置的越大求的均值和方差越接近整个训练集的均值和方差。
-
(3)建议将BN层放在卷积层(Conv)和激活层(例如Relu)之间
-