resnet网络(resnet网络怎么读)

resnet网络(resnet网络怎么读)目录 参考链接 一 什么是 ResNet 二 网络中的亮点 三 为什么采用 residual 两种问题 1 梯度消失和梯度爆炸 2 退化问题 nbsp 解决方法 四 残差学习 五 ResNet 的网络结构 ResNet 中两种不同的 ResNet block 网络结构 nbsp 六 ResNet layers 模型完整代码 1 BasicBlock 2 BottleNeck nbsp 3 ResNet 4 搭建 ResNet 34 ResNet 50 模型 5 网络结构可视化 6



目录

参考链接

一、什么是ResNet?

二、网络中的亮点

三、为什么采用residual?

两种问题:

1.梯度消失和梯度爆炸

2.退化问题

 解决方法

四、残差学习

五、ResNet的网络结构

ResNet中两种不同的ResNet block

网络结构 

六、ResNet-layers模型完整代码

1. BasicBlock

2. BottleNeck

 3. ResNet

4. 搭建ResNet-34、ResNet-50模型

5. 网络结构可视化

6. 查看Pytorch官方源码

7. split_dataset.py

 8. train.py

 【附录:ResNet_layer模型代码】


ResNet网络是在2015年由微软实验室中的何凯明等几位大神提出,论文地址是《Deep Residual Learning for Image Recognition》;是在CVPR 2016发表的一种影响深远的网络模型,由何凯明大神团队提出来,在ImageNet的分类比赛上将网络深度直接提高到了152层,前一年夺冠的VGG只有19层。斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名,可以说ResNet的出现对深度神经网络来说具有重大的历史意义。

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

1.超深的网络结构(超过1000层)。
2.提出residual(残差结构)模块
3.使用Batch Normalization加速训练(丢弃dropout)。

在ResNet提出之前,所有的神经网络都是通过卷积层和池化层的叠加组成的。
人们认为卷积层和池化层的层数越多,获取到的图片特征信息越全,学习效果也就越好。但是在实际的试验中发现,随着卷积层和池化层的叠加,不但没有出现学习效果越来越好的情况,反而出现

1.梯度消失和梯度爆炸


梯度消失:若每一层的误差梯度小于1,反向传播时,网络越深,梯度越趋近于0
梯度爆炸:若每一层的误差梯度大于1,反向传播时,网络越深,梯度越来越大

2.退化问题


随着层数的增加,预测效果反而越来越差。如下图所示 

从图中可以看出错误率在20层时候是最低的,添加到了56层反而更高了。可能会有小伙伴说是不是过拟合了(模型在训练数据上表现很好,但在未见过的新数据上表现较差)?其实可以看出来,如果是你过拟合的话,左侧的训练接在56层时候的错误率依然上升,所以并不是过拟合产生的该情况,是由于神经网络在反向传播过程中通过链式法则不断地反向传播更新梯度,而当网络层数加深时,梯度在传播过程中会逐渐消失也就说我们所说的梯度弥散。这将导致无法对前面网络层的权重进行有效的调整,网络层数越深,训练误差越高,导致训练和测试效果变差,这一现象称为退化。那么,理论上本应该层次更深、效果更好的神经网络,实验结果反而不好,该怎么解决这个问题呢?很多学者都为此感到头疼,幸好RestNet姗姗赶来。

  • 为了解决梯度消失或梯度爆炸问题,ResNet论文提出通过数据的预处理以及在网络中使用 BN(Batch Normalization)层来解决。
  • 为了解决深层网络中的退化问题,可以人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为残差网络 (ResNets)。ResNet论文提出了 residual结构(残差结构)来减轻退化问题,下图是使用residual结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,而是变的更好了。(虚线是train error,实线是test error)

残差观测值与估计值之间的差。

深度网络的退化问题至少说明深度网络不容易训练。但是我们考虑这样一个事实:现在你有一个浅层网络,你想通过向上堆积新层来建立深层网络,一个极端情况是这些增加的层什么也不学习,仅仅复制浅层网络的特征,即这样新层是恒等映射(Identity mapping)。在这种情况下,深层网络应该至少和浅层网络性能一样,那么退化问题就得到了解决。

传统的CNN网络如左图所示,这是一个普通的、两层的卷积+激活。经过两层卷积+一个激活,我们假定它输出为H(x)。与传统的网络结构相比,ResNet增加了短路连接(shortcut connection)或称为跳跃连接(skip connection) ,如右图所示:

这其实就是残差块的关键点所在,它添加了一个短路连接到第二层激活函数之前。那么激活函数的输入就由原来的输出H(x)=F(x)变为了H(x)=F(x)+x。在RestNet中,这种输出=输入的操作成为恒等映射(Identity mapping)通过这种操作,使得网络在最差的情况下也能获得和输入一样的输出,即增加的层什么也不学习,仅仅复制输入的特征,至少使得网络不会出现退化的问题

从数学角度分析一下:

其中和分别表示的是第 个残差单元的输入和输出,注意每个残差单元一般包含多层结构。是残差函数,表示学习到的残差,而 表示恒等映射,是ReLU激活函数。基于上式,我们求得从浅层 到深层的学习特征为:

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

注意:搭建层次网络时,采用三层的残差结构(bottleneck)。

先降后升为了主分支上输出的特征矩阵和捷径分支上输出的特征矩阵形状相同,以便进行加法操作。 

注:CNN参数个数 = 卷积核尺寸×卷积核深度 × 卷积核组数 = 卷积核尺寸 × 输入特征矩阵深度 × 输出特征矩阵深度

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

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

在resnet结构中,主分支与shortcut的输出特征矩阵shape必须相同,因此,如下图右侧所示虚线残差结构,在捷径分支上通过1x1的卷积核进行降维处理,并通过设置步长为2来改变分辨率,最终实现维度的匹配:

ResNet网络是参考了VGG19网络,在其基础上进行了修改,并通过短路机制加入了残差单元,如下图所示。变化主要体现在ResNet直接使用stride=2的卷积做下采样,并且用global average pool层替换了全连接层。ResNet的一个重要设计原则是:当feature map大小降低一半时,feature map的数量增加一倍,这保持了网络层的复杂度。从下图中可以看到,ResNet相比普通网络每两层间增加了短路机制,这就形成了残差学习,其中虚线表示feature map数量发生了改变,即使用了虚线残差结构,通过1*1卷积来改变维度。下图展示的34-layer的ResNet,还可以构建更深的网络如表1所示。从表中可以看到,对于18-layer和34-layer的ResNet,其进行的两层间的残差学习,当网络更深时,其进行的是三层间的残差学习,三层卷积核分别是1x1,3x3和1x1。

 ResNet的网络结构图如图所示:

这是ResNet不同层数的网络结构图

可以看到,结构大差不差。不论是18层、34层、50层、还是101层、152层。

上来都是一个7x7的卷积层,然后是一个3x3的最大池化下采样。

然后就是按照图中的conv2_x、conv3_x、conv4_x、conv5_x中的残差结构。

最后再跟一个平均池化下采样,和全连接层,sofmax输出。

首先,ResNet使用ImagesNet数据集,采用的默认输入尺寸是(224, 224, 3),RGB图像,三通道

按照表中,我们可以看到,图片输入之后,首先是一个7x7,64,stride 2

也就是一个卷积层,卷积核大小为7x7,输出通道为64(也就是卷积核个数),stride=2。

没说padding,我们需要自己算一下,表里写了这一层的输出是112x112

补充一点知识:

假设输入图片为 W x W 卷积核大小为F x F,步长stride=S,padding=P(填充的像素数)
则输出图像的大小 W2 =(W - F +2P)/S +1

可以注意到这个公式中有除法,一般我们做卷积时除不尽的时候都向下取整

可以参考pytorch官方文档:https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#torch.nn.Conv2d

但是我们做池化的时候,也可以采用向上取整

参看pytorch官方文档:https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html#torch.nn.MaxPool2d

有一个参数ceil_mode,默认是floor是向下取整,可以设置为True,向上取整

 
 

有的时候池化会选择向上取整(最大池化和平均池化有时取整方式不同)

那就是说 112 = (224 - 7 + 2P)/ 2 + 1

化简后就是 111 = (217 + 2P)/2 = 108.5+P

所以P=3 所以Padding是3

所以我们输入图片进来,第一层

 

没有偏置bias。经过这一层我们会得到大小为112x112的尺寸,通道数为64

然后经过一个3x3的最大池化下采样,stride=2

池化层也采用向下取整。所以 56=(112 - 3 + 2P)/2 +1 计算出来P=1

所以第二层池化层是

 

经过池化层,我们会得到一个56x56,64通道的输出,紧接着就是conv2_xconv2_x、conv3_x、conv4_x、conv5_x中对应的一系列残差结构,Resnet-18网络中具体的卷积和数和输入输出特征图大小如下图所示:

【注】: 此模型代码与Pytorch官方源码结构逻辑基本一致。具体细节问题,代码中注释已给出解释和说明。

 
 
 
 
 
 
 
 
 
 
 
 

文件: split_dataset.py

功能: 数据集划分脚本。将原始数据集 flower_photos 划分为 train 和 test 两个数据集,并更改图片size=224x224。

数据集下载地址:

数据集保存路径: 根目录 data_set flower_photos

 

文件: train.py

功能: 训练模型 和 验证训练好的模型精度。

ResNet-34 预训练权重文件下载地址:  

【注】:其它ResNet-layer预训练权重下载地址:
 

 
 
 

文件: model.py


                    
编程小号
上一篇 2025-02-27 20:33
下一篇 2025-02-21 23:51

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/20324.html