Part1 论文阅读与视频学习
ResNet
网络的亮点:超深的网络结构(突破1000层);提出residual模块;使用Batch Normalization加速训练(丢弃dropout)。
简单的卷积层和池化层的堆叠并不是层数越深效果越好的。由于层数的加深,梯度消失或梯度爆炸的现象越来越明显;退化问题(degradation problem)也会因为层数的加深而存在。残差模块很好地解决了退化的问题。
两种不同残差结构的。左侧结构针对于网络层数较少的网络使用。右侧残差结构的参数量69732远远小于左侧结构的参数量1179648。
实线残差结构的主分支和shortcut的输出特征矩阵shape必须相同。为实现网络内特征矩阵的转换,虚线残差结构会将输入特征矩阵的高和宽和深度都进行变换。
图中输入矩阵[56,56,64]. 通过stride更改为2将高和宽缩减为一半,再通过128个卷积核来改变特征矩阵的深度,最终输出矩阵为[28,28,128]。
原论文中右侧虚线残差结构的主分支上第一个1*1卷积层的步距是2,第二个3*3卷积层步距是1。在Pytorch官方实现过程中是第一个1*1卷积层的步距是1,第二个3*3卷积层步距是2,这样能够在imagenet的top1上提升大概0.5%的准确率。
对于18层和34层浅层网络结构,通过最大池化下采样后得到的输出是[56,56,64],刚好为实线残差结构所需要的输入shape,所以只在conv3_x、conv4_x、conv5_x对应的第一个虚线残差层使用了虚线残差结构;
对于50层、101层和152层深层网络结构,通过最大池化下采样后得到的输出是[56,56,64],而实现残差结构所需要的输入shape是[56,56,256],所以在conv2_x也使用了虚线残差层,但该虚线残差层只用来调整特征矩阵的深度,高和宽不变。
Batch Normalization 通过该方法能够加速网络的收敛并提升准确率。Batch Normalization的目的就是使我们的feature map满足均值为0,方差为1的分布规律。
batch size为2的Batch Normalization的计算过程。
分别计算x(1)x(1)和x(2)x(2)的均值与方差,得到我们的μ和σ2两个向量。然后在根据标准差计算公式分别计算每个channel的值(公式中的ϵ是一个很小的常量,防止分母为零的情况)。
γ是用来调整数值分布的方差大小,β是用来调节数值均值的位置。这两个参数是在反向传播过程中学习得到的,γ的默认值是1,β的默认值是0。
迁移学习的优势:能够快速的训练出一个理想的结果;当数据集较小时也能训练出理想的效果。
对于conv1、conv2的角点信息和纹理信息都是比较通用的信息,在其他网络中也同样适用,因此可以将学习好的网络参数迁移到新网络中。
常见的迁移学习方式:载入权重后训练所有参数;载入权重后只训练最后几层参数;载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层。
使用Pytorch搭建ResNet并基于迁移学习训练
浅层残差结构
深层残差结构
网络结构
根据不同的参数设置相应层数的网络结构
使用迁移学习的resnet34模型,重新赋值全连接层,花数据集有五个通道(图为猫狗数据集的两个分类的通道)。
根据迁移学习的方法训练 仅训练一个epoch正确率就达到了0.89,损失也降到了0.501。
对某一郁金香图片进行预测也达到了很好的效果。
ResNeXt
ResNeXt网络相对于ResNet网络主要是替换了block的结构。
组卷积 Group Convolution
下面的 block模块在数学计算上完全等价
32代表每一个block采用的group数。分组卷积可以提升准确率,相对于低的group数,32个group的错误率达到最低。
当block层数≥3时才能构建出一个有意义的block。当层数≤3时没有太大的作用。
使用Pytorch搭建ResNeXt
当不传入groups和width_per_group时,width为1,构建的是ResNet的深层残差网络结构;当传入参数时构建的是ResNext的block。
在train.py中更改网络和权重,对ResNeXt50_32x4d网络进行迁移学习训练。
一轮epoch的损失已经降到了0.420
预测的准确率也很高
Part 2 猫狗大战
本次训练采用的网络结构是ResNet34浅层残差结构
进行迁移学习训练,通过三个epoch的训练,准确率达到了0.979,损失也降到了0.127。
对于测试集的图片都有很高的正确预测率。
上传到AI研习社 “猫狗大战” 比赛的网站上的结果。
LeNet
网络的处理
输入图像 3x128x128 ==> conv1( 6x124x124 ==> 6x62x62 )
==> conv2( 16x58x58 ==> 16x29x29 )
==> conv3( 32x26x26 ==> 32x13x13 )
==> conv4( 32x10x10 ==> 32x5x5 )
==> conv5( 32x1x1 ==> 32)
==> 32 ==> 16 ==> 2
构建的LeNet网络结构的准确率比ResNet的准确率在该数据集的处理上要低很多。