注:深度好像就是channel w*h*c
根据b站up霹雳吧啦的讲解做的笔记 视频地址
6.1 ResNet网络结构,BN以及迁移学习详解_哔哩哔哩_bilibiliR
6.2 使用pytorch搭建ResNet并基于迁移学习训练_哔哩哔哩_bilibili
ResNet网络解决梯度消失、爆炸,以及退化(我理解成随着层数的增加精度反而下降)问题
网络中亮点:1超深的网络结构
2提出residuaal模块
3使用batch normalization加速训练(丢弃drop out)
residual结构:
左边是针对网络层数较少的网络(18 34)使用的残差结构,右边对网络层数较多(50 101 152)的网络使用残差结构
主分支与侧分支输出的特征矩阵
相加
,他们的shape需要一样
3*3卷积核,深度为256~
从下面的式子可以看出,右边的网络所需计算量更小
ResNet网络结构分别有 18、34、50、101、152层
拿34层网络结构进行讲解
conv1 7*7卷积核
conv2_x 一系列残差结构中, 最大池化下采样,然后使用三层残差层
conv3_x 四个残差
conv4_x 六个残差结构
conv5_x 三个残差结构
平均池化下采样、全连接、softmax
实线与虚线的结构有何不同?
实线残差结构,输入特征矩阵与输出特征矩阵shape一样,对于虚线残差结构,对应conv3一系列结构的第一层,他的输入特征矩阵shape是【56,56,64】,输出特征矩阵shape是【28,28,128】
对比左右两个残差网络,发现右边第一个3*3卷积的stride发生了变化,经过第一个3*3卷积之后,输入特征向量变成了28*28(可以算出padding=1),通过128个卷积核改变了特征矩阵的深度
捷径 采用1*1卷积核,stride=2卷积之后特征矩阵变成28*28(算出来padding=0)
总结 左边实线部分的残差结构 输入输出特征矩阵shape一样,虚线部分的残差结构 输入输出shape不一样,所以在conv_3\conv_4\conv_5中都是 第一层都是接了虚线的残差结构来使输入shape变成自己需要的shape
原论文中提供了3种残差结构,作者认为B结构最好
注意:
对于18层和34层这两个浅层神经网络,他们经过最大池化下采样之后所得到的特征矩阵就是56*56*64,而conv2需要的残差结构刚好就是56*56*65,浅层网络不需要在第一层使用虚线网络结构,对于深层50 101 152 层来说,他们经过最大池化下采样的shape是56*56*64,而实线残差网络结构需要的输入shape是56*56*256,所以他们在conv2中的第一层也是虚线结构来调整深度
BN层:
在15年 谷歌提出,目的是使我们的一批(batch)
feature map满足均值为0,方差为1的分布规律
,它可以加速网络的收敛并提升准确率)
对于一个拥有d维的输入x,我我们对他的每一个维度进行标准化处理,d就是输入图像的channels,对于RGB图像来说d=3,
其中
就代表我们R通道对应的特征矩阵。标准化处理也就是分别对R\G\B通道进行处理。
计算公式:
1计算一批数据 同一通道所有数据的 对应的均值、方差 (计算得出)
2原参数减去均值 除以方差
3
是一个很小的值,防止分母=0
4
做进一步调整,
调整数据方差大小,初始值为1,
调整均值,初始值为0,如果不用他们调整就得到均值为0,方差为1的数据分布,
,
是通过反向传播学习得到的
举例子:
我们所求的均值和方差是一个向量,维度和channel对应~
使用BN需要注意的问题:
迁移学习:
优势:
1快速训练出理想的结果
2数据集较小时也能训练出理想的结果
注意:使用别人预训练模型参数时,要注意别人的预处理方式
方式:学习浅层网络参数,将网络学习的底层通用特征迁移到新的网络,缩短训练时间
常见迁移学习方式:
1要注意最后一个fc网络,最后一层fc无法载入权重参数
第二三种可以节约时间,节省硬件
使用PyTorch搭建ResNet并基于迁移学习训练