ResNet详解

论文亮点:

  • 超深的网络结构(突破1000层)
  • 提出residual模型
  • 使用BN加速训练,丢弃(Dropout)
    残差结构解决的问题
  • 梯度消失或梯度爆炸
  • 网络退化的问题

残差结构

resnet加模块 resnet架构_神经网络


左边的图是针对于网络层数较少的残差结构,ResNet-34

右边的图是针对网络层数比较神的残差结构,ResNet-50/101/152

残差结构是通过主线的残差结构,加上短接线的输出结构,经过激活函数,这里值得注意的是主分支和shortcut的输出特征矩阵的shape必须是相同的。还有就是这里是在相同的维度上相加,不是GoolNet中的深度拼接。右边的残差结构前后都有一个11的卷积层,通过11的卷积核来进行降维和升维(改变深度)。

假设以256深度作为例子

左图:33256256+33256256=1,179,648

右图:1125664+336464+1164*256=69,632

右图的参数量相比于左图少很多

resnet加模块 resnet架构_深度学习_02


resnet加模块 resnet架构_resnet加模块_03


实线和虚线的区别

实线是输入和输出的特征矩阵的shape是一样的

虚线是输入和输出是不一样的,通过改变步距,使得主分支和捷径分支输出的shape是一样的

同样对于三层的网络结构,虚线原理是一样的

对于深层的结构,在残差结构中一般设置第一层的步距为2,这样的目的是为了对网络层进行下采样,在原论文中只在Conv3/Conv4/Conv5存在虚线,也就是存在下采样。

BN的详解

BN的目的是使一批(Batch)的特征图满足均值为0,方差为1的分布规律
在图像传入第一个卷积层之前,需要对传入的图像数据做预处理,使它满足一定的规律分布,但是在经过卷积层后,数据的分布就不一定满足一定的规律了,BN就是为了使特征图满足均值为0,方差为1的分布规律。
在原文中讲道,对于拥有D维的输入,要对每一维进行标准化处理。假设我们的输入图像是RGB是三通道的彩色图像,标准化处理分别对RGB三个通道进行处理。
使用BN所需要注意的问题

  • 训练时将training=True,在验证时将traing=False,在Pytorch中可通过创建模型model.train()和model.evl()方法控制
  • batch size尽可能设置的大点,设置小后表现的可能很糟糕,设置的越大求得均值和方差就越接近整个训练集的均值和方差
    -建议放在卷积层和激活层之间,卷积层不用设置偏置,因为没有用,设置偏置得到的结果也是一样的。

迁移学习

迁移学习的优势

  • 能够快速的训练出一个理想的结果
  • 当数据集比较少的时候,也能训练出理想的效果
  • 使用别人的预训练模型参数时,要注意别人的预处理方式

浅层的网络参数可以将学好的参数应用到新的网络模型中,因为浅层的网络结可能学到的信息是相同的。
常见的迁移学习的方式

  • 载入权重后训练所有的参数
  • 载入权重后只训练最后几层的参数
  • 载入权重后在原网络的基础上再添加一层的全连接层,仅训练最后一个全连接层(因为分类的类别是不同的,如果想用原模型的所有参数,需要再增加一层新的全连接层)