ResNet详解
论文亮点:
-
超深的网络结构(突破1000层)
-
提出residual模型
-
使用BN加速训练,丢弃(Dropout)
残差结构解决的问题 -
梯度消失或梯度爆炸
-
网络退化的问题
残差结构
左边的图是针对于网络层数较少的残差结构,ResNet-34
右边的图是针对网络层数比较神的残差结构,ResNet-50/101/152
残差结构是通过主线的残差结构,加上短接线的输出结构,经过激活函数,这里值得注意的是主分支和shortcut的输出特征矩阵的shape必须是相同的。还有就是这里是在相同的维度上相加,不是GoolNet中的深度拼接。右边的残差结构前后都有一个11的卷积层,通过11的卷积核来进行降维和升维(改变深度)。
假设以256深度作为例子
左图:33256256+33256256=1,179,648
右图:1125664+336464+1164*256=69,632
右图的参数量相比于左图少很多
实线和虚线的区别
实线是输入和输出的特征矩阵的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尽可能设置的大点,设置小后表现的可能很糟糕,设置的越大求得均值和方差就越接近整个训练集的均值和方差
-建议放在卷积层和激活层之间,卷积层不用设置偏置,因为没有用,设置偏置得到的结果也是一样的。
迁移学习
迁移学习的优势
- 能够快速的训练出一个理想的结果
- 当数据集比较少的时候,也能训练出理想的效果
- 使用别人的预训练模型参数时,要注意别人的预处理方式
浅层的网络参数可以将学好的参数应用到新的网络模型中,因为浅层的网络结可能学到的信息是相同的。
常见的迁移学习的方式
- 载入权重后训练所有的参数
- 载入权重后只训练最后几层的参数
- 载入权重后在原网络的基础上再添加一层的全连接层,仅训练最后一个全连接层(因为分类的类别是不同的,如果想用原模型的所有参数,需要再增加一层新的全连接层)