ResNet网络讲解

type
status
date
slug
summary
tags
category
icon
password

一、什么是ResNet?

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)。

三、为什么采用residual?

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

两种问题:

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

解决方法

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

四、残差学习

残差观测值与估计值之间的差。
notion image
notion image
深度网络的退化问题至少说明深度网络不容易训练。但是我们考虑这样一个事实:现在你有一个浅层网络,你想通过向上堆积新层来建立深层网络,一个极端情况是这些增加的层什么也不学习,仅仅复制浅层网络的特征,即这样新层是恒等映射(Identity mapping)。在这种情况下,深层网络应该至少和浅层网络性能一样,那么退化问题就得到了解决。
传统的CNN网络如左图所示,这是一个普通的、两层的卷积+激活。经过两层卷积+一个激活,我们假定它输出为H(x)。与传统的网络结构相比,ResNet增加了短路连接(shortcut connection)或称为跳跃连接(skip connection) ,如右图所示:
notion image
notion image
这其实就是 残差块的关键点 所在,它添加了一个短路连接到第二层激活函数之前。那么激活函数的输入就由原来的输出H(x)=F(x)变为了H(x)=F(x)+x。在RestNet中,这种输出=输入的操作成为 恒等映射(Identity mapping) 通过这种操作,使得网络在最差的情况下也能获得和输入一样的输出,即增加的层什么也不学习,仅仅复制输入的特征,至少使得网络不会出现退化的问题。
从数学角度分析一下:
notion image
其中
notion image
notion image
分别表示的是第
notion image
个残差单元的输入和输出,注意每个残差单元一般包含多层结构。
notion image
是残差函数,表示学习到的残差,而
notion image
表示
恒等映射
notion image
是ReLU激活函数。基于上式,我们求得从浅层
notion image
到深层
notion image
的学习特征为:
notion image
x_{L}=x_{l}+{i=l}^{L-1} F(x{i}, W_{i})

五、ResNet的网络结构

ResNet中两种不同的ResNet block

ResNet block有两种,一种左侧两层的
BasicBlock
结构,一种是右侧三层的
bottleneck
结构,即将两个
notion image
的卷积层替换为
notion image
,它通过
notion image
conv来巧妙地缩减或扩张feature map维度,从而使得我们的
notion image
conv的filters数目不受上一层输入的影响,它的输出也不会影响到下一层。中间
notion image
的卷积层首先在一个降维
notion image
卷积层下减少了计算,然后在另一个
notion image
的卷积层下做了还原。既
保持了模型精度又减少了网络参数和计算量,节省了计算时间
notion image
注意:搭建深层次网络时,采用三层的残差结构(bottleneck)。
先降后升为了主分支上输出的特征矩阵和捷径分支上输出的特征矩阵 形状相同,以便进行加法操作。
注:CNN参数个数 = 卷积核尺寸×卷积核深度 × 卷积核组数 = 卷积核尺寸 × 输入特征矩阵深度 × 输出特征矩阵深度
注意:
对于短路连接,如果残差映射
notion image
的维度与跳跃连接x的维度不同,那咱们是没有办法对它们两个进行相加操作的,必须对
notion image
进行升维操作,让他俩的维度
相同时才能计算
  • zero-padding全0填充增加维度:
    • 此时一般要先做一个downsamp,可以采用stride=2的pooling,这样不会增加参数
  • 采用新的映射(projection shortcut):
    • 一般采用1x1的卷积,这样会增加参数,也会增加计算量。
在resnet结构中,主分支与shortcut的输出特征矩阵shape必须相同,因此,如下图右侧所示虚线残差结构,在捷径分支上通过1x1的卷积核进行降维处理,并通过设置步长为2来改变分辨率,最终实现维度的匹配:
notion image

网络结构

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。
notion image
ResNet的网络结构图如图所示:
notion image
这是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
notion image
但是我们做池化的时候,也可以采用向上取整
参看pytorch官方文档:https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html#torch.nn.MaxPool2d
有一个参数ceil_mode,默认是floor是向下取整,可以设置为True,向上取整
```cs hljs language-csharp ceil_mode – when True, will use ceil instead of floor to compute the output shape
```
有的时候池化会选择向上取整(最大池化和平均池化有时取整方式不同)
那就是说 112 = (224 - 7 + 2P)/ 2 + 1
化简后就是 111 = (217 + 2P)/2 = 108.5+P
所以P=3 所以Padding是3
所以我们输入图片进来,第一层
```cs hljs language-csharp in_channel=3,out_channel=64,kernel_size=7,stride=2,padding=3
经过池化层,我们会得到一个56x56,64通道的输出,紧接着就是conv2_xconv2_x、conv3_x、conv4_x、conv5_x中对应的一系列残差结构,Resnet-18网络中具体的卷积和数和输入输出特征图大小如下图所示:
notion image

六、ResNet-layers模型完整代码

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

1. BasicBlock

```python hljs
import torch
import torch.nn as nn
class BasicBlock(nn.Module):

3. ResNet

```python hljs
class ResNet(nn.Module):

5. 网络结构可视化

```python hljs

1. 使用torchsummary中的summary查看模型的输入输出形状、顺序结构,网络参数量,网络模型大小等信息

from torchsummary import summary
device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
model = net.to(device)
summary(model, (3, 224, 224)) # 3是RGB通道数,即表示输入224 * 224的3通道的数据

2. 使用torchviz中的make_dot生成模型的网络结构,pdf图包括计算路径、网络各层的权重、偏移量

from torchviz import make_dot
X = torch.rand(size=(1, 3, 224, 224)) # 3是RGB通道数,即表示输入224 * 224的3通道的数据
Y = net(X)
vise = make_dot(Y, params=dict(net.named_parameters()))
vise.view()

7. split_dataset.py

文件: split_dataset.py
功能: 数据集划分脚本。将原始数据集 flower_photos 划分为 train 和 test 两个数据集,并更改图片size=224x224。
数据集保存路径: 根目录  data_set  flower_photos
```python hljs
““”

数据集划分脚本

““”
import os
import glob
import random
from PIL import Image
if name == ‘main’:

【附录:ResNet_layer模型代码】

_文件:_model.py
```python hljs
““”

搭建resnet-layer模型

““”
import torch
import torch.nn as nn
class BasicBlock(nn.Module):
class BottleNeck(nn.Module):
class ResNet(nn.Module):

构建ResNet-34模型

def resnet34(num_classes=1000, include_top=True):

构建ResNet-50模型

def resnet50(num_classes=1000, include_top=True):

模型网络结构可视化

net = resnet34()
““”

1. 使用torchsummary中的summary查看模型的输入输出形状、顺序结构,网络参数量,网络模型大小等信息

from torchsummary import summary
device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
model = net.to(device)
summary(model, (3, 224, 224)) # 3是RGB通道数,即表示输入224 * 224的3通道的数据
““”
““”

2. 使用torchviz中的make_dot生成模型的网络结构,pdf图包括计算路径、网络各层的权重、偏移量

from torchviz import make_dot
X = torch.rand(size=(1, 3, 224, 224)) # 3是RGB通道数,即表示输入224 * 224的3通道的数据
Y = net(X)
vise = make_dot(Y, params=dict(net.named_parameters()))
vise.view()
““”
““”

Pytorch官方ResNet模型

from torchvision.models import resnet34
““”
```
文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树 人工智能 深度学习462379 人正在系统学习中
关注博主即可阅读全文
notion image
notion image
确定要放弃本次机会?
福利倒计时
: :
notion image
立减 ¥
普通VIP年卡可用
notion image
关注关注
  • 110
    • notion image
      notion image
      notion image
点赞
    • notion image
      notion image
  • 953
    • notion image
      notion image
      notion image
收藏
觉得还不错?
一键收藏
notion image
      notion image
复制链接
分享到 QQ
分享到新浪微博
notion image
扫一扫
11-21
notion image
559
10-29
3 条评论您还未登录,请先登录后发表或查看评论
11-9
11-1
04-21
notion image
24万+
04-12
notion image
1万+
11-8
11-2
08-24
notion image
9787
04-22
notion image
5358
11-8
11-8
07-31
notion image
15万+
05-10
11-2
11-5
10-29
01-07
08-19
04-19
notion image
1万+
01-11
notion image
2440
10-31
notion image
2万+
05-18
notion image
2万+
04-20
ResNet 是一种 深度学习 模型,是由Kaiming He等人在2015年提出的。它是深度残差神经 网络 的缩写,是一种非常有名的卷积神经 网络,其结构被广泛应用于计算机视觉领域,尤其是图像分类任务。\ \ ResNet 采用残差学习来解决深度神经 网络 的梯度消失问题,即随着模型深度的增加,模型的准确率不再提高,甚至有所下降。残差学习的核心思想是通过跳跃连接(shortcut connection)将输入和输出连接起来,构建“重定向”式的 网络 结构。这使得深度神经 网络 训练的过程中可以直接传递梯度,避免了梯度消失或爆炸的问题,同时减轻了梯度的信息传递过程中的降噪效应。\ \ ResNet 的架构可以归纳为不同的块,即 ResNet 18、 ResNet 34、 ResNet 50、 ResNet 101和 ResNet 152,它们的 网络 结构都基于 ResNet 的残差块,但不同之处在于层数不同。例如, ResNet 50有50层, ResNet 101有101层,层数越多, 网络 的深度就越深,性能也就越好。 ResNet 中的主要组成部分是卷积层,批量归一化层和激活函数等,因此局部区域处理能力更强,可以提取更多和更细节的特征信息。\ \ 相比于传统的卷积神经 网络ResNet 有很多优点。首先, ResNet 具有非常强的深度表达能力,可以在不增加模型参数数量的前提下增加 网络 深度。其次, ResNet 可以防止梯度消失,避免在训练中出现训练无法收敛的情况。同时, ResNet 的训练速度快,效果稳定,可以实现更好的图像分类效果。\ \ 总之, ResNet 是一种非常优秀的卷积神经 网络,它的创新思想和经典结构对 深度学习 的发展产生了巨大的影响,未来也将成为计算机视觉领域的重要研究方向。
  • 400-660-0108
    • notion image
  • 工作时间 8:30-22:00
  • ©1999-2024北京创新乐知网络技术有限公司
评论 3
notion image
notion image
被折叠的  条评论
notion image
查看更多评论
notion image
添加红包
祝福语
请填写红包祝福语或标题
红包数量
红包个数最小为10个
红包总金额
红包金额最低5元
余额支付
当前余额3.43元 前往充值 >
需支付:10.00元
取消确定
实付元
使用余额支付
notion image
点击重新获取
notion image
notion image
notion image
扫码支付
钱包余额0
notion image
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
notion image
notion image
确定取消
notion image
举报
notion image
选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他
原文链接(必填)
请选择具体原因(必选)
  • 包含不实信息
  • 涉及个人隐私
请选择具体原因(必选)
  • 侮辱谩骂
  • 诽谤
请选择具体原因(必选)
  • 搬家样式
  • 博文样式
补充说明(选填)
取消
确定
notion image
notion image
新手引导
notion image
客服举报
notion image
返回
顶部
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
登录后您可以享受以下权益:
  • 免费复制代码
    • notion image
  • 和博主大V互动
    • notion image
  • 下载海量资源
    • notion image
  • 发动态/写文章/加入社区
    • notion image
×立即登录
Prev
artificial-intelligence-terminology-database-a
Next
OpenManus代码解读
Loading...