文章目录

  • 前言
  • 一、Resnet是什么?
  • 二、网络中的亮点
  • 1.超深的网络结构(突破1000层)
  • 2.提出residual模块
  • 1.Residual出现的原因
  • 2.什么是残差结构(Residual)
  • 3.不同深度的ResNet网络结构配置
  • 3.使用BatchNormalization加速训练(丢弃dropout)
  • 3.1 什么是Batch Normalization
  • 3.2 BatchNormalization的原理
  • 3.3 使用BatchNormalization需要注意的问题



前言

分析ResNet网络的结构,了解Batch Normalization和迁移学习的相关概念

一、Resnet是什么?

ResNet 是2015年由微软实验室提出,斩获当年ImageNet中分类任务的第一名,目标检测第一名。获得coco数据集中目标检测第一名,图像分割第一名。

二、网络中的亮点

1.超深的网络结构(突破1000层)

ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_深度学习

2.提出residual模块

1.Residual出现的原因

在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与下采样层进行堆叠得到的。但是当堆叠到一定网络深度时,就会出现两个问题:
(1)梯度消失或梯度爆炸
(2)退化问题(degradation problem)

ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_卷积_02

可以利用权重初始化,对数据进行标准化处理,以及BN(Batch Normalization),但是这样仍然会存在退化问题(degradation problem)那就需要利用残差结构来解决。

2.什么是残差结构(Residual)

ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_数据_03


ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_深度学习_04

  • 左边的残差结构是针对层数较少网络,例如ResNet18层和ResNet34层网络。右边是针对网络层数较多的网络,例如ResNet101,ResNet152等
  • 实线结构的残差块和虚线结构的残差块的区别:
  • 残差结构右侧的连接线是shortcut分支也称捷径分支(注意为了让主分支上的输出矩阵能够与我们捷径分支上的输出矩阵进行相加,必须保证这两个输出特征矩阵有相同的shape)
3.不同深度的ResNet网络结构配置

ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_方差_05

此表可以和上面的34-layer residual一起看,如下图:

ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_卷积_06

左边图中的conv3_x中34-layer列中的*4对应右图中四个残差块

对于我们ResNeXt网络配置图中,表中conv3_1(1代表第一层), conv4_1, conv5_1所对应的都是虚线残差结构。因为这一系列残差结构的第一层都有调整输入特征矩阵shape的使命(将特征矩阵的高和宽缩减为原来的一半,将深度channel调整成下一层残差结构所需要的channel)。为了方便理解,下面给出了ResNet34的网络结构图,图中简单标注了一些信息。

ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_方差_07

3.使用BatchNormalization加速训练(丢弃dropout)

3.1 什么是Batch Normalization

Batch Normalization是google团队在2015年论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的。通过该方法能够加速网络的收敛并提升准确率

3.2 BatchNormalization的原理

我们在对图像进行预处理的过程中通常会对图像进行标准化处理,这样可以加速网络的收敛。如下图所示,Conv1经过预处理后可能满足某一分布的特征矩阵,但是对于Conv2输入的feature map就不一定满足了(整个训练样本集对应的feature map 要满足一定的分布规律,而BatchNormalization就是让我们的feature map 满足均值为0,方差为1的规律。

ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_卷积_08


更详细来说,原论文中指到:“对于一个拥有d维的输入x,我们将对它的每一个维度进行标准化处理。” 假设我们输入的x是RGB三通道的彩色图像,那么这里的d就是输入图像的channels即d=3,,其中就代表我们的R通道所对应的特征矩阵,依此类推。标准化处理也就是分别对我们的R通道,G通道,B通道进行处理。上面的公式不用看,原文提供了更加详细的计算公式:

ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_卷积_09


ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_数据_10


我们刚刚有说让feature map满足某一分布规律,理论上是指整个训练样本集所对应feature map的数据要满足分布规律,也就是说要计算出整个训练集的feature map然后在进行标准化处理,对于一个大型的数据集明显是不可能的,所以论文中说的是Batch Normalization,也就是我们计算一个Batch数据的feature map然后在进行标准化(batch越大越接近整个数据集的分布,效果越好)。我们根据上图的公式可以知道代表着我们计算的feature map每个维度(channel)的均值,注意是一个向量不是一个值,向量的每一个元素代表着一个维度(channel)的均值,代表着我们计算的feature map每个维度(channel)的方差,然后根据和计算标准化处理后得到的值。下图给出了一个计算均值和方差的示例:

ResNet50和ImageNet大概需要训练多久RTX3090 resnet imagenet_卷积_11


上图展示了一个batch size为2(两张图片)的Batch Normalization的计算过程,假设feature1、feature2分别是由image1、image2经过一系列卷积池化后得到的特征矩阵,feature的channel为2,那么代表该batch的所有feature的channel1的数据,同理代表该batch的所有feature的channel2的数据。然后分别计算和的均值与方差,得到我们的和两个向量。然后在根据标准差计算公式分别计算每个channel的值(公式中的是一个很小的常量,防止分母为零的情况)。在我们训练网络的过程中,我们是通过一个batch一个batch的数据进行训练的,但是我们在预测过程中通常都是输入一张图片进行预测,此时batch size为1,如果在通过上述方法计算均值和方差就没有意义了。所以我们在训练过程中要去不断的计算每个batch的均值和方差,并使用移动平均(moving average)的方法记录统计的均值和方差,在训练完后我们可以近似认为所统计的均值和方差就等于整个训练集的均值和方差。然后在我们验证以及预测过程中,就使用统计得到的均值和方差进行标准化处理。

细心的同学会发现,在原论文公式中不是还有,两个参数吗?是的,是用来调整数值分布的方差大小,是用来调节数值均值的位置。这两个参数是在反向传播过程中学习得到的,伽马的默认值是1,贝塔的默认值是0。

3.3 使用BatchNormalization需要注意的问题

  1. 训练时要将traning参数设置为True,在验证时将trainning参数设置为False。在pytorch中可通过创建模型的model.train()和model.eval()方法控制。
  2. batch size尽可能设置大点,设置小后表现可能很糟糕,设置的越大求的均值和方差越接近整个训练集的均值和方差。
  3. 建议将bn层放在卷积层(Conv)和激活层(例如Relu)之间,且卷积层不要使用偏置bias,因为没有用,参考下图推理,即使使用了偏置bias求出的结果也是一样的