Pytorch之ResNet图像分类

目录
前言
一、网络结构
1.结构
2.BN(Batch )层
二、网络结构
三、网络实现
1.构建网络
【Pytorch之ResNet图像分类】2.加载数据集
3.训练和测试模型
四、实现图像分类
前言
2015 年,微软亚洲研究院何凯明等人发表了基于 Skip的深度残差网络(,简称 )算法,并提出了 18 层、34 层、50 层、101层、152 层的 -18、-34、-50、-101 和 -152 等模型,甚至成功训练出层数达到 1202 层的极深层神经网络,斩获当年竞赛中分类任务第一名,目标检测第一名 。获得COCO数据集中目标检测第一名,图像分割第一名 。论文至今已经获得超 25000的引用量,可见在人工智能行业的影响力 。
一、网络结构
1.结构
、VGG、 等网络模型的出现将神经网络的发展带入了几十层的阶段,研究人员发现网络的层数越深,越有可能获得更好的泛化能力 。
神经网络越深的卷积层理论上可以提取更多的图像特征,但是事实结果并不是,如下图:
从上图中可以看出随着层数的增加,预测效果反而越来越差,网络层数越深,训练误差越高,导致训练和测试效果变差,这一现象称为退化 。
为了解决深层网络中的退化问题,给深层神经网络添加一种回退到浅层神经网络的机制 。当深层神经网络可以回退到浅层神经网络时,深层神经网络可以获得和浅层神经网络相当的模型性能,而不至于更糟糕 。
这种神经网络被称为残差网络 () 。论文提出了结构(残差结构)来减轻退化问题 。
block有两种,一种两层结构,一种三层结构 。
左图为是以两个3*3的卷积网络串接在一起作为一个残差模块,主分支和支路维度都一直保持相同 。
右图为是1*1、3*3、1*1的3个卷积网络串接在一起作为一个残差模块 。第一层的1× 1的卷积核的作用是对特征矩阵进行降维操作,将特征矩阵的深度由256降为64; 第三层的1× 1的卷积核是对特征矩阵进行升维操作,将特征矩阵的深度由64升成256 。降低特征矩阵的深度主要是为了减少参数的个数 。
先降后升为了主分支上输出的特征矩阵和分支上输出的特征矩阵形状相同,以便进行加法操作 。一般搭建深层次网络时,采用三层残差结构 。
通过在卷积层的输入和输出之间添加 Skip实现层数回退机制,如下图上所示,输入x通过两个卷积层,得到特征变换后的输出?(x),与输入x进行对应元素的相加运算,得到最终输出?(x):?(x) = x+ ?(x) 。
?(x)叫作残差模块( Block,简称 ) 。由于被 Skip包围的卷积神经网络需要学习映射?(x) = ?(x) ? x,故称为残差网络 。
为了能够满足输入x与卷积层的输出?(x)能够相加运算,需要输入x的 shape 与?(x)的shape 完全一致 。
当出现 shape 不一致时,一般通过在 Skip上添加额外的卷积运算环节将输入x变换到与?(x)相同的 shape,如图上图中(x)函数所示,其中(x)以 × 的卷积运算居多,如1*1卷积,对进行升维操作,调整输入的通道数 。
注意,让x和?(x)相加,即特征矩阵对应的位置上的数字进行相加,与中的拼接不一样,是在维度上直接进行的拼接,并不是相加 。
下图是和的网络结构
从残差网络结构中给出了两种连接,分别是实线连接和虚线连接 。如下图所示,
实线残差结构:对应残差模块而言,输入特征矩阵和输出特征矩阵形状大小相同,能够直接相加 。
虚线残差结构:输入特征矩阵和输出特征矩阵不能直接相加,输入特征矩阵需要经过分支上的1×1的卷积核进行了维度处理(特征矩阵在长宽方向降采样,深度方向调整成下一层残差结构所需要的) 。