IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【深度学习】ResNet网络详解 -> 正文阅读

[人工智能]【深度学习】ResNet网络详解

ResNet

参考

ResNet论文:
https://arxiv.org/abs/1512.03385
本文主要参考视频:https://www.bilibili.com/video/BV1T7411T7wa
https://www.bilibili.com/video/BV14E411H7Uw

结构概况

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

在这里插入图片描述

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

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

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

然后就是按照图中的conv2_xconv3_xconv4_xconv5_x中的残差结构。

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

conv1与池化层

我们先看一下前两层。

在这里插入图片描述

首先呢,ResNet使用ImagesNet数据集,采用的默认输入尺寸是224x224,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,向上取整

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

所以我们输入图片进来,第一层是in_channel=3,out_channel=64,kernel_size=7,stride=2,padding=3

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

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

W o u t = ( W i n ? F + 2 P ) / S + 1 W_{out}= (W_{in} - F + 2P)/S + 1 Wout?=(Win??F+2P)/S+1

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

所以第二层池化层是in_channel=64,out_channel=64,kernel_size=3,stride=2,padding=1

经过池化层,我们会得到一个56x56,64通道的输出,紧接着就是conv2_x中对应的一系列残差结构

残差结构

经过前面两层,我们得到一个56x56,64通道的输出

紧接着是conv2_x

这就是残差块,残差块大致有两种类型,一种是两层卷积的,一种的三层卷积的,就是途中红框画的。

在这里插入图片描述

比如如果是ResNet34,那么池化层之后,就是两个3x3,64的卷积层,这两个组成一个残差块。

如果是ResNet50,那么池化层之后就是1x1,64的卷积层 + 3x3,64的卷积层 + 1x1,256的卷积层,三个组成一个残差块。

后面写的x3就代表有三个这样的残差块连接一起

如下图所示,关于残差结构的原理,不多说了,这里主要讲实现。

在这里插入图片描述

有几个点需要注意:

以ResNet34为例,按照表格里面写的,池化之后,我们的大小是56x56x64,那么经过conv2_x之后我们的输出还是56x56x64

输入和输出特征矩阵的大小一样,那么就说明stride=1,padding=1

因为公式 W o u t = ( W i n ? F + 2 P ) / S + 1 W_{out}= (W_{in} - F + 2P)/S + 1 Wout?=(Win??F+2P)/S+1

要保证一样,那就S=1,不然的话,大于1就没法一样,然后计算padding可知,也是1

所以经过这两层之后呢,得到的还是56x56x64的特征图,可以直接与残差块那个分支相加。

但是呢这里需要注意,我们看conv3_x,是3x3,128通道,也就是说经过conv2_x后得到的56x56,64通道

conv3_x里面升维了,并且大小也变了,变成28x28了

这时候要注意一个问题,分支与主分支的结果就无法相加了,大小不一致,维度不一致啊

怎么办呢,所以还有一种虚线连接的残差块,如图

在这里插入图片描述

在分支里面做了一个1x1的卷积层,1x1的卷积层主要是用来升维和降维的。同时通过设置stride可以改变尺寸

所以就通过这个卷积层得到了28x28,128通道的特征图,可以与主分支直接相加了

并且我们通过计算可以算出来,残差块主分支padding=1,右边的分支padding=2

对于ResNet50和101,深层次的ResNet也是按照这样的方法处理的

在这里插入图片描述

但是注意啊,这种虚线结构只是为了解决尺寸不一样无法相加的情况

什么情况下需要用这个呢?

对于ResNet18和ResNet34而言,conv3_xconv4_xconv5_x的第一层才需要虚线结构。

可以看到表里面,ResNet34的conv3_x的第一层会输出28x28,128通道的,但是输入是56x56,64通道的,所以需要虚线结构,而conv2_x不需要,因为输入输出是一样的。

而对于ResNet50和ResNet101,ResNet152而言,conv2_xconv3_xconv4_xconv5_x的第一层都需要虚线结构

因为ResNet50从conv2_x开始,输入56x56,64通道,输出是56x56,256通道的,所以conv2_x也需要虚线结构,不过这个虚线结构只调整通道数即可。

在这里插入图片描述

所以,我们根据表格可以看到ResNet50中,conv3_x有四个残差块,这其中只有第一个会遇到尺寸不一样的问题,需要用虚线结构,别的都不需要。

同样的,conv4_xconv5_x的第一层也需要

另外再注意一个改进:

在这里插入图片描述

Batch Normalization

Batch Normalization的目的是使我们的一批(Batch)feature map满足均值为0,方差为1的分布规律。

这里关于BN层的原理就不写了,可以看这个视频和博客

https://www.bilibili.com/video/BV1T7411T7wa

https://blog.csdn.net/qq_37541097/article/details/104434557

我们需要知道的是

建议将bn层放在卷积层(Conv)和激活层(例如Relu)之间,且卷积层不要使用偏置bias

所以说,我们实际上的残差网络块应该是如图,这个样子的

在这里插入图片描述

总结

至此,整个ResNet的网络结构就清晰了。其中需要注意的点主要就是:

  • 计算卷积过程中的参数 W o u t = ( W i n ? F + 2 P ) / S + 1 W_{out}= (W_{in} - F + 2P)/S + 1 Wout?=(Win??F+2P)/S+1
  • ResNet18层和34层conv3_xconv4_xconv5_x中的第一层需要用虚线结构
  • ResNet50层、101层和152层中的conv2_xconv3_xconv4_xconv5_x中的第一层都需要用虚线结构
  • BN层放在卷积层(Conv)和Relu之间,且卷积层不要使用偏置bias
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:33:42  更:2022-10-17 12:33:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 21:21:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码