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.退化问题随着层数的增加,预测效果反而越来越差。如下图所示
从图中可以看出错误率在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激活函数。基于上式,我们求得从浅层
到深层
的学习特征为:
x_{L}=x_{l}+{i=l}^{L-1} F(x{i}, W_{i})
五、ResNet的网络结构
ResNet中两种不同的ResNet block
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,向上取整```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网络中具体的卷积和数和输入输出特征图大小如下图所示:

六、ResNet-layers模型完整代码

【注】:此模型代码与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
““”
```
文章知识点与官方知识档案匹配,可进一步学习相关知识
关注博主即可阅读全文


确定要放弃本次机会?
福利倒计时
: :

立减 ¥
普通VIP年卡可用

关注关注
- 110



点赞
- 踩


- 953



收藏
觉得还不错?
一键收藏

- \ 3 评论


复制链接
分享到 QQ
分享到新浪微博

扫一扫
11-21

559
残差 网络( ResNet)的提出是为了解决深度神经 网络 的“退化”(优化)问题。有论文指出,神经 网络 越来越深的时候,反传回来的梯度之间的相关性会越来越差,最后接近白噪声。即更深的卷积 网络 会产生梯度消失问题导致 网络 无法有效训练。而 ResNet 通过设计残差块结构,调整模型结构,让更深的模型能够有效训练更训练。目前 ResNet 被当作目标检测、语义分割等视觉算法框架的主流 backbone。作者提出认为,假设一个比较浅的卷积 网络 已经可以达到不错的效果,那么即使新加了很多卷积层什么也不做,模型的效果也不会变差。
10-29
关于 resNet,笔者使用的 讲解 PPT,具体 讲解 内容包括,框架的发明背景,框架解决的问题,框架的创新点,框架的具体实现架构,框架效果与其他架构之间的对比,以及对于框架的数学原理的部分浅显解释
3 条评论您还未登录,请先登录后发表或查看评论
11-9
深度: ResNet 可以构建非常深的 网络 结构,通过不断增加 网络 深度来提高性能。 残差块: ResNet 的基本组成单元是残差块,每个残差块包含多个卷积层和一个跨层连接。 高效性: ResNet 在保持 网络 性能的同时,通过残差块的设计减少了计算量,提高了计算效率。 三、 ResNet 优缺点 优点 可以训练非常深的 网络:通过残差连接, ResNet 解决…
11-1
ResNet 有两种block,一种是两层的BasicBlock,一种是三层的Bottleneck 两层的BasicBlock用于浅层 网络( ResNet 18、 ResNet 34),分实线和虚线的BasicBlock 实线BasicBlock :包含两个卷积层 根据这个图举个例子,例如输入是64×56×56 第一个卷积:64个3×3卷积核, stride=1,padding=1 输入:64×56×56 输出:64×56×…
04-21

24万+
ResNet 学习什么是 ResNet 为什么要引入 ResNet? ResNet 详细解说\
\
本篇博客主要是自己对论文的一些解读以及参考一些博客后的理解,如若有不对之处,请给为道友指出。多谢!\
\
2015年刚提出 ResNet 的Paper\
2016对 ResNet 进行改进之后的Paper\
什么是 ResNet ResNet 是一种残差 网络,咱们可以把它理解为一个子 网络,这个子 网络 经过堆叠可以构成一个很深的 网络。咱们…
04-12

1万+
[ 图像分类 ] 经典 网络 模型4—— ResNet 详解与复现\
1、Residual Network\
2、残差 网络\
3、Residual Block\
4、 ResNet 50 详解\
5、 ResNet 50 复现\
6、 ResNet 50 结构框图\
Residual Network\
简称 ResNet (残差 网络),何凯明团队于2015年提出的一种 网络;\
在 ImageNet 比赛 classification 任务上获得第一名;\
目前在检测,分割,识别等领域里得到了广泛的应用;…
11-8
ResNet 50结构框图: 🚀 ResNet 复现 # Here is the code :importtorchimporttorch.nnasnnimporttorch.nn.functionalasFfromtorchinfoimportsummaryclassBasicBlock(nn.Module):# 左侧的 residual block 结构(18-layer、34-layer)expansion=1def__init__(self,in_planes,planes,stride=1):# 两层卷积 Conv2d + …
11-2
参数效率:与传统的深层 网络 相比, ResNet 能以更少的参数实现更好的性能。 二、 深度学习 与梯度消失问题 在深入研究深度残差 网络( ResNet)之前,理解梯度消失问题是至关重要的。该问题长期以来一直是训练深层神经 网络 的主要难点。本节将 讲解 梯度消失问题的基本原理,以及这一问题如何影响 深度学习 模型的训练。
08-24

9787
04-22

5358
11-8
1 ResNet 介绍 1.1 ResNet 概述 RestNet是2015年由微软团队提出的,在当时获得分类任务,目标检测,图像分割第一名。该论文的四位作者何恺明、张祥雨、任少卿和孙剑如今在 人工智能 领域里都是响当当的名字,当时他们都是微软亚研的一员。实验结果显示,残差 网络 更容易优化,并且加深 网络 层数有助于提高正确率。在ImageNet上使用…
11-8
Pytorch搭建 ResNet 1. 问题描述 1.1 ResNet 卷积神经 网络 逐渐取代传统算法,成为处理计算机视觉任务的核心, ResNet[1]的提出更是CNN图像史上一件里程碑事件。当 网络 深度增加时, 网络 准确度出现饱和甚至下降,残差学习的提出解决了 网络 退化的问题。 ResNet 通过shortcut的方法让信息跨层传播,被跨越的层拟合的就是shortcut…
07-31

15万+
1、 RestNet 网络\
1.1、 RestNet 网络 结构\
ResNet 在2015年被提出,在ImageNet比赛classification任务上获得第一名,因为它“简单与实用”并存,之后很多方法都建立在 ResNet 50或者 ResNet 101的基础上完成的,检测,分割,识别等领域里得到广泛的应用。它使用了一种连接方式叫做“shortcut connection”,顾名思义,shortcut就是“…
05-10
11-2
ResNet 神经 网络 搭建 一、定义残差结构 BasicBlock 18层、34层 网络 对应的残差结构 浅层 网络 主线由两个3x3的卷积层链接,相加后通过relu激活函数输出。还有一个shortcut捷径 参数解释 expansion = 1 :判断对应主分支的残差结构有无变化 downsample=None :下采样参数,默认为none…
11-5
1. ResNet(ResidualNetwork)是一种深度神经 网络 结构,被广泛应用于图像分类、目标检测和语义分割等计算机视觉任务中。它是由微软亚洲研究院的何凯明等人于2015年提出的,通过引入残差连接(Residual connection)解决了深层 网络 训练过程中的梯度消失和梯度爆炸问题,有效地加深了 网络 的深度。
10-29
### 深度残差学习框架解析 #### 一、引言 近年来, 深度学习 技术在计算机视觉领域取得了显著…通过以上内容的介绍,我们可以看出 ResNet 作为一种有效的 深度学习 模型,对于解决深层神经 网络 中的退化问题具有重要意义。
01-07
08-19
深度学习 讲解 是指对 深度学习 基本操作的详细解释和 讲解,涵盖了 深度学习 的基本概念、 深度学习 模型、 深度学习 算法等。 深度学习 基本操作包括: 1. 数据加载:使用 imageDatastore 等函数加载图像数据,或者使用其他…
04-19

1万+
01-11

2440
文章目录1 概述2 SE- ResNet module3 SE- resnet 网络 pytorch实现\
1 概述\
SENet是Squeeze-and-Excitation Networks的简称,拿到了ImageNet2017分类比赛冠军,其效果得到了认可,其提出的SE模块思想简单,易于实现,并且很容易可以加载到现有的 网络 模型框架中。SENet主要是学习了channel之间的相关性,筛选出了针对通道的注意力,稍微增加了一点计算量,但是效果比较好。\
\
我们可以看到,已经有很多工作在空间维度上来提升 网络 的性能。那么很
10-31

2万+
RestNet在《Deep Residual Learning for Image Recognition》论文中提出,是在CVPR 2016发表的一种影响深远的 网络 模型,由何凯明大神团队提出来,在ImageNet的分类比赛上将 网络 深度直接提高到了152层,前一年夺冠的VGG只有19层。ImageNet的目标检测以碾压的优势成功夺得了当年识别和目标检测的冠军,COCO数据集的目标检测和图像分割比赛上同样碾压夺冠,可以说RestNet的出现对深度神经 网络 来说具有重大的历史意义。论文下载地址:地址,…
05-18

2万+
RestNet是2015年由微软团队提出的,在当时获得分类任务,目标检测,图像分割第一名。该论文的四位作者何恺明、张祥雨、任少卿和孙剑如今在 人工智能 领域里都是响当当的名字,当时他们都是微软亚研的一员。实验结果显示,残差 网络 更容易优化,并且加深 网络 层数有助于提高正确率。在ImageNet上使用152层的残差 网络(VGG net的8倍深度,但残差 网络 复杂度更低)。对这些 网络 使用集成方法实现了3.75%的错误率。获得了ILSVRC 2015竞赛的第一名。原文链接这是一篇计算机视觉领域的经典论文。
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

- 工作时间 8:30-22:00
- ©1999-2024北京创新乐知网络技术有限公司
评论 3


被折叠的 条评论

查看更多评论

添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消确定
实付元
使用余额支付

点击重新获取



扫码支付
钱包余额0

抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

确定取消

举报

选择你想要举报的内容(必选)
- 内容涉黄
- 政治相关
- 内容抄袭
- 涉嫌广告
- 内容侵权
- 侮辱谩骂
- 样式问题
- 其他
原文链接(必填)
请选择具体原因(必选)
- 包含不实信息
- 涉及个人隐私
请选择具体原因(必选)
- 侮辱谩骂
- 诽谤
请选择具体原因(必选)
- 搬家样式
- 博文样式
补充说明(选填)
取消
确定


新手引导

客服举报

返回
顶部












登录后您可以享受以下权益:
- 免费复制代码
- 和博主大V互动
- 下载海量资源
- 发动态/写文章/加入社区
×立即登录
Prev
artificial-intelligence-terminology-database-a
Next
OpenManus代码解读
Loading...