ResNet网络详解
网络亮点:
超深的网络结构(突破1000层)
提出residual模块
使用Batch Normalization加速训练(丢弃dropout层)
对比:
通过简单的卷积层、最大池化下采样层堆叠网络,并不能达到层数越深效果越好;通过下图可以看出56层的效果远差于20层。
随着网络的加深会产生问题:
梯度消失或梯度爆炸:通过对数据进行标准化处理,BN处理等解决
退化问题(degradation problem):通过残差解决问题
提出的ResNet:
根据下图,实线代表验证集错误率,虚线代表训练集错误率;层数越深,训练效果越好,ResNet解决了退化问题,可以通过残差结构不断加深网络,以获得更好的结果。
34层网络结构图:
由一系列残差结构组成,最后通过一个平均池化下采样、全连接层得到最终输出
与表格相互对应
残差结构:
conv2_x:无虚线结构
conv3_x:第一层使用了虚线残差结构
conv4_x
conv5_x
平均池化下采样层及全连接层:
与多层网络结构对比:
对于18层、34层网络结构,通过最大池化下采样后得到56*56*64的特征矩阵,而残差结构所需要的输入也刚好为56*56*64
对于50层、101层、152层网络结构,通过最大池化下采样后得到56*56*64的特征矩阵,而残差结构的输入需要56*56*256
Residual结构:
给出两种不同的残差结构,左边更适合网络层数较少的网络(如ResNet34),而右边的结构更适合网络层数较多的网络(如ResNet50/101/152)
左解析:
实线部分:
过程:
主线(左)将输入的特征矩阵通过两个3*3的卷积层,在右边有一条弧线(捷径分支)直接从输入连接到输出;在主分支上进行一系列操作得到的特征矩阵再与输入特征矩阵进行相加,最后通过ReLU激活函数
注意:
主分支与shortcut的输出特征矩阵shape(H、W、channel)必须相同,才可以保证在相同维度上做加法运算(而不是在深度上做拼接)
虚线部分:
第一个3*3的卷积的stride发生变化,因为需要把[56,56,64]变为[28,28,128],高宽变为原来的,stride=2
捷径分支加入了1*1的卷积核,采用stride=2,高宽变为原来的
右解析:
实线部分:
过程:
主分支首先通过1*1卷积层,再通过3*3卷积层,再通过1*1卷积层,与左残差结构的区别是在输入和输出时都加入了“1*1卷积”
通过1*1卷积后,高和宽不变,但深度由256变为64,第一个1*1卷积层的作用是降维
通过1*1卷积后,高和宽不变,但深度由64变为256,第二个1*1卷积的作用是升维,这样才可以与输入特征矩阵进行相加。
参数变化:
左残差结构:
3*3*256*256+3*3*256*256=1179648
右残差结构:
1*1*256*64+3*3*64*64+1*1*64*256=69632
节省了很多参数
虚线部分:
右侧虚线残差结构的主分支上,第一个1*1卷积层的步距=2,第二个3*3卷积层的步距=1
但在pytorch官方实现过程中,第一个1*1卷积层的步距=1,第二个3*3卷积层的步距=2,这样可以在ImageNet的top1上提升大概0.5%的准确率
Batch Normalization:
目的:
使一批(batch)feature map满足均值为0,方差为1的分布规律。
过程:
在正向传播过程中统计得到
在反向传播过程中训练得到
迁移学习:
优势:
能够快速的训练出一个理想结果
当数据集较小时也能训练出理想的效果
注意:
使用别人预训练模型参数时,要注意别人的预处理方式
常见的迁移学习的方式:
1.载入权重后训练所有参数
2.载入权重后只训练最后几层参数
3.载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层