Pytorch之ResNet图像分类( 二 )


/34实线/虚线残差结构图
/101/152实线/虚线残差结构图
不同深度的网络结构配置,注意表中的残差结构给出了主分支上卷积核的大小与卷积核个数,表中残差块×N 表示将该残差结构重复N次 。
, , 所对应的一系列残差结构的第一层残差结构都是虚线残差结构 。因为这一系列残差结构的第一层都有调整输入特征矩阵shape的作用(将特征矩阵的高和宽缩减为原来的一半,将深度调整成下一层残差结构所需要的)
注意,对于/101/152,其实所对应的一系列残差结构的第一层也是虚线残差结构,因为它需要调整输入特征矩阵的 。
根据表格可知通过3x3的max pool之后输出的特征矩阵shape应该是[56, 56, 64],但所对应的一系列残差结构中的实线残差结构它们期望的输入特征矩阵shape是[56, 56, 256](因为这样才能保证输入输出特征矩阵shape相同,才能将分支的输出与主分支的输出进行相加) 。所以第一层残差结构需要将shape从[56, 56, 64] --> [56, 56, 256] 。
注意,这里只调整维度,高和宽不变,而, , 所对应的一系列残差结构的第一层虚线残差结构不仅要调整还要将高和宽缩减为原来的一半 。
下图是使用结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,而是变的更好了 。(虚线是train error,实线是test error)
2.BN(Batch )层
同时当模型加深以后,网络变得越来越难训练,这主要是由于梯度消失和梯度爆炸现象造成的 。在较深层数的神经网络中,梯度信息由网络的末层逐层传向网络的首层时,传递的过程中会出现梯度接近于 0 或梯度值非常大的现象 。网络层数越深,这种现象可能会越严重 。
梯度消失和梯度爆炸产生原因:
梯度消失:若每一层的误差梯度小于1,反向传播时,网络越深,梯度越趋近于0
梯度爆炸:若每一层的误差梯度大于1,反向传播时,网络越深,梯度越来越大
那么怎么解决深层神经网络的梯度弥散和梯度爆炸现象呢?
为了解决梯度消失或梯度爆炸问题,论文提出通过数据的预处理以及在网络中使用 BN(Batch )层来解决 。
Batch 是指批标准化处理,将一批数据的 map满足均值为0,方差为1的分布规律 。
在图像预处理过程中通常会对图像进行标准化处理,这样能够加速网络的收敛,如下图所示,对于Conv1来说输入的就是满足某一分布的特征矩阵,但对于Conv2而言输入的 map就不一定满足某一分布规律 。
注意这里所说满足某一分布规律并不是指某一个 map的数据要满足分布规律,理论上是指整个训练样本集所对应 map的数据要满足分布规律 。Batch 的目的就是使数据的 map满足均值为0,方差为1的分布规律 。
“ 对于一个拥有d维的输入x,我们将对它的每一个维度进行标准化处理 。” 假设我们输入的x是RGB三通道的彩色图像,那么这里的d就是输入图像的即d=3,
,其中
就代表我们的R通道所对应的特征矩阵,依此类推 。标准化处理也就是分别对我们的R通道,G通道,B通道进行处理 。
处理公式如下:
让 map满足某一分布规律,理论上是指整个训练样本集所对应 map的数据要满足分布规律,即要计算出整个训练集的 map然后在进行标准化处理,对于一个大型的数据集明显是不可能的 。
所以论文中的Batch,指的是计算一个Batch数据的 map然后在进行标准化(batch越大越接近整个数据集的分布,效果越好) 。
根据上图的公式可以知道
代表着计算的 map每个维度()的均值,注意是一个向量不是一个值,向量的每一个元素代表着一个维度()的均值 。