首页 > 编程知识 正文

resnet网络结构详解,resnet图像分类

时间:2023-05-06 16:13:05 阅读:14906 作者:4988

Resnet详细信息:从原理到结构什么是Resnet? 模型退化残差学习resnet结构block结构网络结构改进的残差结构

什么是resnet?

Resnet在cnn图像方面有非常突出的表现,利用shortcut短路连接,解决了深度网络中模型退化的问题。 比普通网络每2层/3层增加短路机制,通过残差学习使深层网络发挥作用。

这里我要谈几个概念:

模型退化的神经网络层数越多,网络就越能进行更复杂的特征提取,在理论上能得到更好的结果。 但是,实验表明,随着网络深度的增加,精度饱和并下降。 (这不是过度拟合的问题。 因为训练误差也很大。 以及batch normalization等技术解决了梯度消失和梯度爆炸的问题)

梯度消失和梯度爆炸的解决方法:对输入数据和中间层数据进行归一化操作,该方法可以保证网络在反向传播中采用随机梯度下降(SGD ),使网络收敛。 但是,这种方法只对几十层的网络有用。 当网络进一步加深时,这种方法就没有用了。

在下图中,可以看到56层的网络比20层的效果更低。

残差学习残差即观测值与估计值之差。

假设要构建深层网络。 不断积累新的一层,但增加的一层什么都不学习。 (极端情况下)这样,作为浅层网络特征的新层将只复制浅层的“恒定映射”(Identity mapping )。 这样,深层网络的性能至少应该和浅层网络相同。 那样的话,劣化问题就解决了。

将解的映射设为h(x )即观测值,将当前阶层的resnet/当前残差块输出的特征映射设为x(identityfunction跳跃连结)即估计值。 可以将问题转换为求解网络的残差映射函数f(x )=h ) x )- x。

网络深,发生退化问题时,我们的残差映射f(x )为0即可。 即,要求解的映射h ) x )等于从上一层输出的特征映射x。 由于x是当前输出的最佳解,我们的分层/残差块的网络状态仍然是最佳状态。

但是,上述的是理想的假设,实际上残差f(x )不会变成0。 x一定很难达到最佳,但总是有可以无限接近最佳解的瞬间。 采用ResNet,只需将f(x )部分的权重值更新得较小即可,可以更好地学习新的特征。

让我们从数学上分析一下:

yl=h(xL ) f ) xL,W l ) y_L=h ) x_L ) f ) x_L,W_l ) yl=h(xL ) f ) xL,W l ) ) ) ) )

(x1=f(yL ) x_{L1}=f ) y _ l (xl1=f (yl ) ) ) ) ) ) ) 652

其中,x l x_l xl和x l

1 x_{l+1} xl+1​ 代表残差单元的输入和输出, F F F 是我们学习到的残差, h ( x l ) = x l h(x_l) = x_l h(xl​)=xl​ 表示恒等映射, f f f 是relu激活函数。

那么,从浅层 l l l 到深层 L L L 我们学习到的特征就是:

x L = x l + ∑ i = 1 L − 1 F ( x i , W i ) x_L = x_l + sum_{i=1}^{L-1}F(x_i, W_i) xL​=xl​+∑i=1L−1​F(xi​,Wi​)

resnet结构 block结构

ResNet block有两种,一种两层结构,一种是三层的bottleneck结构,即将两个3x3的卷积层替换为1x1 + 3x3 + 1x1,它通过1x1 conv来巧妙地缩减或扩张feature map维度,从而使得我们的3x3 conv的filters数目不受上一层输入的影响,它的输出也不会影响到下一层。中间3x3的卷积层首先在一个降维1x1卷积层下减少了计算,然后在另一个1x1的卷积层下做了还原。既保持了模型精度又减少了网络参数和计算量,节省了计算时间。

注意:
对于短路连接,如果残差映射F(x)的维度与跳跃连接x的维度不同,那咱们是没有办法对它们两个进行相加操作的,必须对x进行升维操作,让他俩的维度相同时才能计算:

zero-padding全0填充增加维度:
此时一般要先做一个downsamp,可以采用stride=2的pooling,这样不会增加参数采用新的映射(projection shortcut):
一般采用1x1的卷积,这样会增加参数,也会增加计算量。

在resnet结构图中,虚线表示feature map数量发生了改变,虚线残差结构有降维的作用,并在捷径分支上通过1x1的卷积核进行降维处理,下面详细讲一下虚线部分的结构:

上图是ResNet18层和ResNet34层网络的虚线残差结构。注意下每个卷积层的步距stride,以及捷径分支上的卷积核的个数(与主分支上的卷积核个数相同)。

上图是ResNet50/101/152的残差结构,在该残差结构当中,主分支使用了三个卷积层:

1x1的卷积层用来压缩channel维度3x3的卷积层1x1的卷积层用来还原channel维度(注意主分支上第一层卷积层和第二次卷积层所使用的卷积核个数是相同的,第三次是第一层的4倍)。

该残差结构同样在捷径分支上有一层1x1的卷积层,它的卷积核个数与主分支上的第三层卷积层卷积核个数相同,注意每个卷积层的步距。

网络结构

ResNet网络参考了VGG19网络,在其基础上进行了修改,并通过短路机制加入了残差单元,变化主要体现在ResNet直接使用stride=2的卷积做下采样,并且用global average pool层替换了全连接层。

注意ResNet的激活函数放在跳接之后。

上图中输入图片size为(224, 224, 3)

经过第一个7x7的卷积层,输出channel为64,步长为2,注意pad为3,即在周围填充三圈

经过一个3x3的最大池化层,步长为2,注意pad为1

与VGGNet不同的是,ResNet除了一个3x3的最大池化层,其他下采样全都是使用卷积层实现
如上图,我们称conv2_x、conv3_x、conv4_x、conv5_x为四个卷积组,conv2_x的下采样由最大池化层实现,其他三个卷积组的下采样,都是由邻接上一个卷积组的残差块实现。

那到底哪些残差结构是虚线残差结构呢?对于我们ResNet18/34/50/101/152,表中conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层残差结构都是虚线残差结构。因为这一系列残差结构的第一层都有调整输入特征矩阵shape的使命(将特征矩阵的高和宽缩减为原来的一半,将深度channel调整成下一层残差结构所需要的channel)。为了方便理解,下面给出了ResNet34的网络结构图,图中简单标注了一些信息。

对于我们ResNet50/101/152,其实在conv2_x所对应的一系列残差结构的第一层也是虚线残差结构。因为它需要调整输入特征矩阵的channel,根据表格可知通过3x3的max pool之后输出的特征矩阵shape应该是[56, 56, 64],但我们conv2_x所对应的一系列残差结构中的实线残差结构它们期望的输入特征矩阵shape是[56, 56, 256](因为这样才能保证输入输出特征矩阵shape相同,才能将捷径分支的输出与主分支的输出进行相加)。所以第一层残差结构需要将shape从[56, 56, 64] --> [56, 56, 256]。注意,这里只调整channel维度,高和宽不变(而conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层虚线残差结构不仅要调整channel还要将高和宽缩减为原来的一半)。

ResNet的一个重要设计原则是:当feature map大小降低一半时,feature map的数量增加一倍,这保持了网络层的复杂度。

改进的残差结构


改进前后一个明显的变化是采用pre-activation,BN和ReLU都提前了。而且作者推荐短路连接采用恒等变换,这样保证短路连接不会有阻碍。

笔记基于以下参考整理而来:
ResNet详解——通俗易懂版
你必须要知道CNN模型:ResNet
经典分类CNN模型系列其四:Resnet
ResNet系列网络结构
残差resnet网络原理详解
ResNet网络结构详解与模型的搭建

最后一个参考中还给出了视频的讲解链接,有时间再看:
ResNet网络结构详解视频
使用pytorch搭建ResNet并基于迁移学习训练
使用tensorflow搭建ResNet网络并基于迁移学习的方法进行训练

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。