深度学习——残差网络(ResNet)
深度学习——残差网络(ResNet)
文章目录
- 前言
- 一、函数类
- 二、残差块
- 三、ResNet模型
- 四、模型训练
- 五、小结
- 总结
前言
随着设计越来越深的网络,深刻理解“新添加的层如何提升神经网络的性能”变得至关重要。更重要的是设计网络的能力,在这种网络中,添加层会使网络更具表现力, 为了取得质的突破,我们需要一些数学基础知识。
本章主要学习残差网络
参考书:
《动手学深度学习》
一、函数类
首先,假设有一类特定的神经网络架构 F \mathcal{F} F,它包括学习速率和其他超参数设置。对于所有 f ∈ F f \in \mathcal{F} f∈F,存在一些参数集(例如权重和偏置),这些参数可以通过在合适的数据集上进行训练而获得。
现在假设 f ∗ f^* f∗是我们真正想要找到的函数,如果是 f ∗ ∈ F f^* \in \mathcal{F} f∗∈F,那我们可以轻而易举的训练得到它,但通常我们不会那么幸运。
相反,我们将尝试找到一个函数 f F ∗ f^*_\mathcal{F} fF∗,这是我们在 F \mathcal{F} F中的最佳选择。
例如,给定一个具有 X \mathbf{X} X特性和 y \mathbf{y} y标签的数据集,我们可以尝试通过解决以下优化问题来找到它:
f F ∗ : = a r g m i n f L ( X , y , f ) subject to f ∈ F . f^*_\mathcal{F} := \mathop{\mathrm{argmin}}_f L(\mathbf{X}, \mathbf{y}, f) \text{ subject to } f \in \mathcal{F}. fF∗:=argminfL(X,y,f) subject to f∈F.
那么,怎样得到更近似真正 f ∗ f^* f∗的函数呢?
唯一合理的可能性是,我们需要设计一个更强大的架构 F ′ \mathcal{F}' F′。
换句话说,我们预计 f F ′ ∗ f^*_{\mathcal{F}'} fF′∗比 f F ∗ f^*_{\mathcal{F}} fF∗“更近似”。
然而,如果 F ⊈ F ′ \mathcal{F} \not\subseteq \mathcal{F}' F⊆F′,则无法保证新的体系“更近似”。事实上, f F ′ ∗ f^*_{\mathcal{F}'} fF′∗可能更糟:
如图中所示,对于非嵌套函数类,较复杂的函数类并不总是向“真”函数 f ∗ f^* f∗靠拢(复杂度由 F 1 \mathcal{F}_1 F1向 F 6 \mathcal{F}_6 F6递增)。虽然 F 3 \mathcal{F}_3 F3比 F 1 \mathcal{F}_1 F1更接近 f ∗ f^* f∗,但 F 6 \mathcal{F}_6 F6却离的更远了。
相反对于 图中右侧的嵌套函数类 F 1 ⊆ … ⊆ F 6 \mathcal{F}_1 \subseteq \ldots \subseteq \mathcal{F}_6 F1⊆…⊆F6,可以避免上述问题。
因此,只有当较复杂的函数类包含较小的函数类时,我们才能确保提高它们的性能。
对于深度神经网络,如果我们能将新添加的层训练成恒等映射 f ( x ) = x f(\mathbf{x}) = \mathbf{x} f(x)=x,新模型和原模型将同样有效。
同时,由于新模型可能得出更优的解来拟合训练数据集,因此添加层似乎更容易降低训练误差。
针对这一问题,何恺明等人提出了残差网络(ResNet),其核心思想是:每个附加层都应该更容易地包含原始函数作为其元素之一。
于是,残差块(residual blocks)便诞生了,
也就是说:在残差块中,每个层的输入不仅包含前一层的输出,还包含了原始输入。这样做的目的是让网络学习到残差(即当前层的输出与原始输入之间的差异)。
二、残差块
右图是ResNet的基础架构–残差块。 在残差块中,输入可通过跨层数据线路更快地向前传播。
ResNet沿用了VGG完整的 3 × 3 3\times 3 3×3卷积层设计。 残差块里首先有2个有相同输出通道数的 3 × 3 3\times 3 3×3卷积层。
每个卷积层后接一个批量规范化层和ReLU激活函数。 然后我们通过跨层数据通路,跳过这2个卷积运算,将输入直接加在最后的ReLU激活函数前。
这样的设计要求2个卷积层的输出与输入形状一样,从而使它们可以相加。
如果想改变通道数,就需要引入一个额外的 1 × 1 1\times 1 1×1卷积层来将输入变换成需要的形状后再做相加运算。
残差块的实现如下:
import torch
from torch import nn
from d2l import torch as d2l
from torch.nn import functional as F#残差块的实现
class Residual(nn.Module):def __init__(self,input_channels,num_channels,use_1x1conv= False,strides =1):super().__init__()self.conv1 = nn.Conv2d(input_channels,num_channels,kernel_size=3,padding=1,stride=strides)self.conv2 = nn.Conv2d(num_channels, num_channels,kernel_size=3, padding=1)if use_1x1conv:self.conv3 = nn.Conv2d(input_channels,num_channels,kernel_size=1,stride=strides)else:self.conv3 = Noneself.bn1 = nn.BatchNorm2d(num_channels)self.bn2 = nn.BatchNorm2d(num_channels)def forward(self,X):Y = F.relu(self.bn1(self.conv1(X)))Y = self.bn2(self.conv2(Y))if self.conv3:X = self.conv3(X)Y +=Xreturn F.relu(Y)#查看输入和输出形状一致的情况
blk = Residual(3,3)
X = torch.rand(size=(4,3,6,6))
Y = blk(X)
print(Y.shape)#也可以在增加输出通道数的同时,减半输出的高度和宽度
blk = Residual(3,6,use_1x1conv=True,strides=2)
print(blk(X).shape)
此代码生成两种类型的网络: 一种是当use_1x1conv=False时,应用ReLU非线性函数之前,将输入添加到输出。 另一种是当use_1x1conv=True时,添加通过1×1卷积调整通道和分辨率。
三、ResNet模型
ResNet的前两层跟之前介绍的GoogLeNet中的一样: 在输出通道数为64、步幅为2的7×7卷积层后,接步幅为2的3×3的最大汇聚层。 不同之处在于ResNet每个卷积层后增加了批量规范化层。
GoogLeNet在后面接了4个由Inception块组成的模块。 ResNet则使用4个由残差块组成的模块,每个模块使用若干个同样输出通道数的残差块。
"""
ResNet模型
"""b1 = nn.Sequential(nn.Conv2d(1,64,kernel_size=7,stride=2,padding=3),nn.BatchNorm2d(64),nn.ReLU(),nn.MaxPool2d(kernel_size=3,stride=2,padding=1))#注意,我们对第一个模块做了特别处理。
def resnet_block(input_channels,num_channels,num_residuals,first_block = False):blk = []for i in range(num_residuals):if i ==0 and not first_block:blk.append(Residual(input_channels,num_channels,use_1x1conv=True,strides=2))else:blk.append(Residual(num_residuals,num_channels))return blk#接着在ResNet加入所有残差块,这里每个模块使用2个残差块
b2 = nn.Sequential(*resnet_block(64,64,2,first_block=True))
b3 = nn.Sequential(*resnet_block(64,128,2))
b4 = nn.Sequential(*resnet_block(128, 256, 2))
b5 = nn.Sequential(*resnet_block(256, 512, 2))#最后,与GoogLeNet一样,在ResNet中加入全局平均汇聚层,以及全连接层输出。
net = nn.Sequential(b1,b2,b3,b4,b5,nn.AdaptiveAvgPool2d((1,1)),nn.Flatten(),nn.Linear(512,10))#查看每个模块的输出形状
X = torch.rand(size=(1,1,224,224))
for layer in net:X = layer(X)print(layer.__class__.__name__,"输出形状为:\t",X.shape)
四、模型训练
#模型训练
lr,num_epochs,batch_size = 0.05,10,256
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size,resize=96)
d2l.train_ch6(net,train_iter,test_iter,num_epochs,lr,device=d2l.try_gpu())
d2l.plt.show()
五、小结
- 学习嵌套函数是训练神经网络的理想情况。在深层神经网络中,学习另一层作为恒等映射较容易(尽管这是一个极端情况)。
- 残差映射可以更容易地学习同一函数,例如将权重层中的参数近似为零。
- 利用残差块可以训练出一个有效的深层神经网络:输入可以通过层间的残余连接更快地向前传播。
总结
总之,残差网络通过残差映射学习到了输入与输出之间的差异;通过将输入与输出直接相加,实现了信息的跳跃连接;通过堆叠多个残差块来构建更深的网络,提高了网络的表达能力。
既以为人己愈有,既以与人己愈多。
–2023-10-15 进阶篇
相关文章:
![](https://img-blog.csdnimg.cn/9345ee1fa6774f8085c84652d1b7878b.png)
深度学习——残差网络(ResNet)
深度学习——残差网络(ResNet) 文章目录 前言一、函数类二、残差块三、ResNet模型四、模型训练五、小结总结 前言 随着设计越来越深的网络,深刻理解“新添加的层如何提升神经网络的性能”变得至关重要。更重要的是设计网络的能力,…...
![](https://img-blog.csdnimg.cn/21f35691f16241afa41a6b35a07b9edd.png)
[java进阶]——IO流,递归实现多级文件拷贝
🌈键盘敲烂,年薪30万🌈 目录 一、认识IO流 二、了解编码与解码 二、IO流体系 三、字节输入输出流 四、字符输入输出流 五、多级文件拷贝 一、认识IO流 IO流也叫输入流(intput)、输出流(onput),该流就像java程序同硬盘之间的…...
![](https://img-blog.csdnimg.cn/901edc6798234646b157b22b6c985e66.png#pic_center)
Linux创建与删除用户
Linux创建与删除用户 新增用户: adduser 用户名【添加用户】 passwd 用户名【设置用户密码】删除用户: userdel -r 用户名【删除用户】...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
对传感器采样数据的低通滤波
低通滤波(Low-pass filter) 是一种过滤方式,规则为低频信号能正常通过,而超过设定临界值的高频信号则被阻隔、减弱。 一阶低通数字滤波器 滤波系数a越小,滤波结果越平稳,但是灵敏度低;滤波系数a越大,滤波结…...
![](https://img-blog.csdnimg.cn/ac0d546cfbc7486dae6572b017ff57f5.png)
Java开发树结构数据封装!
目录 源数据如下controller接口:service层封装:Dao接口:Dao层Mapper:映射实体类: 源数据如下 controller接口: RequestMapping("/UserTreeInfo")public RespBody getUserTreeInfo(Long userId) {List<MenuTreeVo>…...
![](https://img-blog.csdnimg.cn/fc12b4e07d854b8ba0474411cde2bbac.png#pic_center)
c++学习笔记汇总
[TOC] (C学习笔记汇总) 基础认识、基础语法 类、类与类之间的关系、可调用对象、std::function类模板、c11新标准、资源管理方案RAII、指针、智能指针、引用计数、C的多态 ios、istream、iostream、fstream、sstream 模板编程: 模板编程:主要分为“泛…...
![](https://img-blog.csdnimg.cn/ffa639ef1cb843cda3eb638e36c6d95b.png)
[动手学深度学习]生成对抗网络GAN学习笔记
论文原文:Generative Adversarial Nets (neurips.cc) 李沐GAN论文逐段精读:GAN论文逐段精读【论文精读】_哔哩哔哩_bilibili 论文代码:http://www.github.com/goodfeli/adversarial Ian, J. et al. (2014) Generative adversarial network…...
![](https://img-blog.csdnimg.cn/638de5f2b6bf48978dd6cc3ed2e63b89.png)
Kotlin中的算数运算符
在Kotlin中,我们可以使用各种算术运算符来进行数值计算和操作。下面对这些运算符进行详细描述,并提供示例代码。 正号(正数)和负号(负数): 正号用于表示一个正数,不对数值进行任何…...
![](https://img-blog.csdnimg.cn/0d8f9104917a4d6e894c53e25fa8946f.png)
Linux高性能服务器编程 学习笔记 第十六章 服务器调制、调试和测试
Linux平台的一个优秀特性是内核微调,即我们可以通过修改文件的方式来调整内核参数。 服务器开发过程中,可能会碰到意想不到的错误,一种调试方法是用tcpdump抓包,但这种方法主要用于分析程序的输入和输出,对于服务器的…...
![](https://www.ngui.cc/images/no-images.jpg)
第三期:云函数入门指南答案
1.云函数需要用户自行考虑租用/购买多少资源以达到最少成本最高效运行自己的函数。 答案:错误(False) 2.Cloud Functions可以为您准备好计算资源,弹性地、可地运行任务,并提供日志查询、性能监控和报警等功能。 答案:正确(True…...
![](https://img-blog.csdnimg.cn/5ff63006f1c0444799b121673b54f83f.png)
企业怎么通过数字化工具来实现数字化转型?
数字化转型是使用数字技术和工具从根本上改变公司运营方式并向客户提供价值的过程。它涉及思维方式、流程和技术的全面转变,以跟上快节奏的数字时代。以下是有关公司如何通过数字工具实现数字化转型的分步指南: 1.定义您的愿景和目标: 首先确…...
![](https://img-blog.csdnimg.cn/823f10a3e580496eb97cc0132ff06228.gif)
React函数式写法和类式写法的区别(以一个计数器功能为例子)
函数式写法更加简洁和函数式编程思维导向,适用于无状态、UI纯粹的组件,且可以使用Hooks处理副作用。而类式写法适用于有内部状态、生命周期方法和复杂交互逻辑的组件,提供了更多的灵活性和控制力。 文章目录 一、计数器功能演示 1.函数式写法…...
![](https://www.ngui.cc/images/no-images.jpg)
【根据国防科大学报官网word模板修改的Latex模板】
根据国防科大学报官网word模板修改的Latex模板 学报Word模板链接Latex模板结构编译环境为Texlivevscode或Textstudio 学报Word模板链接 学报官网相关下载链接 点击链接即可前往官网下载相关word模板 Latex模板结构 latex模板 ass.cfg文件 %深层模板文件ass.cls文件 %浅层模板…...
![](https://www.ngui.cc/images/no-images.jpg)
系列十一、Redis中分布式缓存实现
一、缓存 1.1、什么是缓存 内存就是计算机内存中的一段数据。 1.2、内存中的数据特点 读写快断电数据丢失 1.3、缓存解决了什么问题 提高了网站的吞吐量和运行效率减轻了数据库的访问压力 1.4、哪些数据适合加缓存 使用缓存时,一定是数据库中的数据极少发生改…...
![](https://www.ngui.cc/images/no-images.jpg)
Spark大数据分析与实战笔记(第一章 Scala语言基础-4)
文章目录 每日一句正能量1.4 Scala面向对象的特性1.4.1 类与对象的特性1.4.2 继承1.4.3 单例对象和伴生对象1.4.4 特质 每日一句正能量 若要快乐,就要随和;若要幸福,就要随缘。快乐是心的愉悦,幸福是心的满足。别和他人争吵&#…...
![](https://img-blog.csdnimg.cn/09567dda267847eea03703719d5d4839.png)
腾讯云服务器端口localhost可以访问,外部无法访问解决
搭建frp跳板,发现无法使用。ssh 连接不上。 主要检查2个东西: 1. ubuntu ufw系统防火墙。这个默认是关掉的 2. tencent这个防火墙规则设置后,还要设置到实例上。 以前不是这样的。就掉坑里了。 # systemctl rootVM-4-4-ubuntu:/lib/syst…...
![](https://img-blog.csdnimg.cn/2fd3899bf61b4c8f82334df4630331ca.png)
【软考-中级】系统集成项目管理工程师 【16 变更管理】
持续更新。。。。。。。。。。。。。。。 【第十六章】变更管理 (选择2分 考点 1:变更的常见原因考点 2:变更管理的原则是项目基准化、变更管理过程规范化考点 3考点 4考点 5:变更的工作程序考点 6考点 7考点 8考点 9考点 10考点 11考点 12:变更分类系列文章经典语录 考点 1:变…...
![](https://img-blog.csdnimg.cn/ba721df27b8c4a92b851c85d3f9ab579.png)
【Eclipse】查看版本号
1.在Eclipse的启动页面会出现版本号 2. Eclipse的关于里面 Help - About Eclipse IDE 如下图所示,就为其版本 3.通过查看readme_eclipse.html文件...
![](https://www.ngui.cc/images/no-images.jpg)
论文精讲目录
ViT论文逐段精读【论文精读】MoCo 论文逐段精读【论文精读】对比学习论文综述【论文精读】Swin Transformer论文精读【论文精读】CLIP 论文逐段精读【论文精读】双流网络论文逐段精读【论文精读】I3D 论文精读【论文精读】视频理解论文串讲(上)【论文精读…...
![](https://www.ngui.cc/images/no-images.jpg)
双飞翼布局和圣杯布局
双飞翼布局和圣杯布局都是一种三栏布局,其中主要内容区域位于中间,左侧栏和右侧栏位于两侧。它们的实现方式类似,但有一些细微的差别。 双飞翼布局的实现原理是通过使用flex布局,给主要内容区域设置flex:1;…...
![](https://www.ngui.cc/images/no-images.jpg)
Hive insert插入数据与with子查询
1. insert into 与 insert overwrite区别 insert into 与 insert overwrite 都可以向hive表中插入数据,但是insert into直接追加到表中数据的尾部,而insert overwrite会重写数据,既先进行删除,再写入 注意:如果存在分…...
![](https://www.ngui.cc/images/no-images.jpg)
如何在Django中集成JWT
文章目录 JWT简介在Django中使用JWT1. 安装2. 配置3. 添加认证接口 客户端使用JWT1. 获取新token2. 调用API3. 刷新token 同步发布在个人站点:https://panzhixiang.cn JWT简介 JWT(JSON Web Token)是一种流行的跨域认证解决方案。它可以在令牌中安全地传输用户身份…...
![](https://www.ngui.cc/images/no-images.jpg)
hive进行base64 加密解密函数
加密 select base64(cast(abcd as binary))YWJjZA 解密 -- 直接解密(结果字段格式为比binary格式) select unbase64(YWJjZA) -- 格式转换 select cast(unbase64(YWJjZA) as string) abcd...
![](https://img-blog.csdnimg.cn/9baae0979dd94878a220d3a26d687e82.png)
Docker安装GitLab及使用图文教程
作者: 宋发元 GitLab安装及使用教程 官方教程 https://docs.gitlab.com/ee/install/docker.html Docker安装GitLab 宿主机创建容器持久化目录卷 mkdir -p /docker/gitlab/{config,data,logs}拉取GitLab镜像 docker pull gitlab/gitlab-ce:15.3.1-ce.0运行GitLa…...
![](https://img-blog.csdnimg.cn/9d6398ae1d9f4b32b261c78fc87ec515.png)
asp.net酒店管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
一、源码特点 asp.net酒店管理系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言开发 asp.net 酒店管理系统1 二、功能介绍 …...
![](https://img-blog.csdnimg.cn/cb41e6d8894d4160af576b17bb5e814b.png)
Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv 计算机竞赛
1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 Yolov安全帽佩戴检测 危险区域进入检测 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖&am…...
![](https://www.ngui.cc/images/no-images.jpg)
vue中动态设置source标签
项目中有个视频播放,路径通过接口返回,而且不带后缀,并不确定是什么类型的视频文件,所以要通过source标签去进行设置. 问题:当video中存在source标签的时候,浏览器渲染之后会自动去获取地址,即便地址改变,浏览器也不会再去获取地址。 解决方…...
![](https://www.ngui.cc/images/no-images.jpg)
【16】基础知识:React路由 - React Router 6
一、概述 了解 React Router 以三个不同的包发布到 npm 上,它们分别为 1、react-router:路由的核心库,提供了很多的组件、钩子。 2、react-router-dom:包含 react-router 所有内容,并添加一些专门用于 DOM 的组件&…...
![](https://img-blog.csdnimg.cn/b79ccbc9e9a7424d806e789531828606.png)
Unity3D 基础——Coroutine 协同程序
Coroutine 称为协同程序或者协程,协同程序可以和主程序并行运行,和多线程有些类似。协同程序可以用来实现让一段程序等待一段时间后继续运行的效果。例如,执行步骤1,等待3秒;执行步骤2,等待某个条件为 true…...
![](https://www.ngui.cc/images/no-images.jpg)
IDEA报错:前言中不允许有内容
idea启动项目提示前言中不允许有内容 .idea\libraries\Maven__axis2_axis2_1_0.xml: ParseError at [row,col]:[1,1] Message: 前言中不允许有内容。 解决方法: 首先修改设置:IDEA–>File–>Settings–>File Encodings–>with No BOM选中报…...
![](/images/no-images.jpg)
亳州做网站哪家好/樱桃bt磁力天堂
实际生产开发中,遇到突发情况,需要紧急修复线上bug,但是灰度环境(或者其他预生产测试环境)已经存在多个新功能的代码了,这时候我们可能选择直接在生产tag版本的代码上进行修复并发布。 local_branch : 本地分支名 tag_name : 生…...
![](/images/no-images.jpg)
实训网站建设的总结/推广策略包括哪些内容
冬天快到了。蚂蚁和蟋蟀在各自忙着准备过冬食物。蚂蚁从早忙到晚,忙忙碌碌地搬运着,而蟋蟀则悠哉游哉,仍然在不停地歌唱着。 蚂蚁问:“你怎么不抓紧准备冬天的粮食?” 蟋蟀说:“你没有听见我在唱歌吗&#…...
![](/images/no-images.jpg)
ih5 做视频网站/贵阳网站建设制作
??正想点击一个在线同学的头像,电话铃响了,一看号码,生疏的数字串。按键接听,虽然不大熟习的男中音,所传来的欢乐而冲动的音符却使我捕到了久违的欢喜信息!那语气,企业宣传片 ,只能是亲朋好友…...
![](/images/no-images.jpg)
广东圆心网站开发/seo规则
问题描述 在 GNU Emacs 中,切换窗口(Window)是件麻烦的事情(20.3 Using Other Windows),因为我们希望按下快捷键,直接切换到特定窗口(Window),而不是快捷键组…...
![](https://img-blog.csdnimg.cn/img_convert/d781fc27f1a3f38939f7ca0967fee0a4.gif)
做网站 需要 域名 空间/腾讯云域名
自己从一手看官方文档到撸过6个小程序,自己填了不少坑,也在微信社区见证了小程序一次次改版分享一些之前记录的常用小技巧解决小问题,欢迎讨论指正改变小程序原生组件大小微信官方提供了一些基本组件,但是有的组件没有提供类似siz…...
![](https://images2018.cnblogs.com/blog/1186474/201807/1186474-20180723144535931-170892776.jpg)
网站建设标新立异/小红书推广怎么做
1、亚马逊商品页面链接地址(本次要爬取的页面url) https://www.amazon.cn/dp/B07BSLQ65P/ 2、代码部分 import requestsurl "https://www.amazon.cn/dp/B07BSLQ65P/"try: kv {user-agent: Mozilla/5.0} # 修改了发起请求的请求头中的user-agent的值ÿ…...