吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.3-2.4

目录

  • 第四门课 卷积神经网络(Convolutional Neural Networks)
    • 第二周 深度卷积网络:实例探究(Deep convolutional models: case studies)
      • 2.3 残差网络(ResNets)(Residual Networks (ResNets))
      • 2.4 残差网络为什么有用?(Why ResNets work?)

第四门课 卷积神经网络(Convolutional Neural Networks)

第二周 深度卷积网络:实例探究(Deep convolutional models: case studies)

2.3 残差网络(ResNets)(Residual Networks (ResNets))

非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。这节课我们学习跳跃连接(Skip connection),它可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。我们可以利用跳跃连接构建能够训练深度网络的 ResNets,有时深度能够超过 100 层,让我们开始吧。ResNets 是由残差块(Residual block)构建的,首先我解释一下什么是残差块。

在这里插入图片描述
这是一个两层神经网络,在𝐿层进行激活,得到 a [ l + 1 ] a^{[l+1]} a[l+1],再次进行激活,两层之后得到 a [ l + 2 ] a^{[l+2]} a[l+2]。计算过程是从 a [ l ] a^{[l]} a[l]开始,首先进行线性激活,根据这个公式: z [ l + 1 ] = W [ l + 1 ] a [ l ] + b [ l + 1 ] z^{[l+1]} = W^{[l+1]}a^{[l]} + b^{[l+1]} z[l+1]=W[l+1]a[l]+b[l+1],通过a[l]算出 z [ l + 1 ] z^{[l+1]} z[l+1],即a[l]乘以权重矩阵,再加上偏差因子。然后通过 ReLU 非线性激活函数得到 a [ l + 1 ] a^{[l+1]} a[l+1] a [ l + 1 ] = g ( z [ l + 1 ] ) a^{[l+1]} = g(z^{[l+1]}) a[l+1]=g(z[l+1]) 计 算 得 出 。 接 着 再 次 进 行 线 性 激 活 , 依 据 等 式 z [ l + 2 ] = W [ 2 + 1 ] a [ l + 1 ] + b [ l + 2 ] z^{[l+2]} =W^{[2+1]}a^{[l+1]} + b^{[l+2]} z[l+2]=W[2+1]a[l+1]+b[l+2],最后根据这个等式再次进行 ReLu 非线性激活,即 a [ l + 2 ] = g ( z [ l + 2 ] ) a^{[l+2]} = g(z^{[l+2]}) a[l+2]=g(z[l+2]),这里的𝑔是指 ReLU 非线性函数,得到的结果就是 a [ l + 2 ] a^{[l+2]} a[l+2]。换句话说,信息流从 a [ l ] a^{[l]} a[l] a [ l + 2 ] a^{[l+2]} a[l+2]需要经过以上所有步骤,即这组网络层的主路径。

在这里插入图片描述

在残差网络中有一点变化,我们将𝑎[𝑙]直接向后,拷贝到神经网络的深层,在 ReLU 非线性激活函数前加上𝑎[𝑙],这是一条捷径。𝑎
[𝑙]的信息直接到达神经网络的深层,不再沿着主路径传递,这就意味着最后这个等式(𝑎[𝑙+2] = 𝑔(𝑧[𝑙+2]))去掉了,取而代之的是另一个 ReLU 非线性函数,仍然对𝑧[𝑙+2]进行 𝑔函数处理,但这次要加上𝑎[𝑙],即:𝑎[𝑙+2] = 𝑔(𝑧[𝑙+2] + 𝑎[𝑙]),也就是加上的这个𝑎[𝑙]产生了一个残差块。

在这里插入图片描述
在上面这个图中,我们也可以画一条捷径,直达第二层。实际上这条捷径是在进行 ReLU非线性激活函数之前加上的,而这里的每一个节点都执行了线性函数和 ReLU 激活函数。所以𝑎[𝑙]插入的时机是在线性激活之后,ReLU 激活之前。除了捷径,你还会听到另一个术语“跳跃连接”,就是指𝑎[𝑙]跳过一层或者好几层,从而将信息传递到神经网络的更深层。

ResNet 的发明者是何恺明(Kaiming He)、张翔宇(Xiangyu Zhang)、任少卿(Shaoqing Ren)和孙剑(Jiangxi Sun),他们发现使用残差块能够训练更深的神经网络。所以构建一个ResNet 网络就是通过将很多这样的残差块堆积在一起,形成一个很深神经网络,我们来看
看这个网络。

在这里插入图片描述
这并不是一个残差网络,而是一个普通网络(Plain network),这个术语来自 ResNet 论文。

在这里插入图片描述
把它变成 ResNet 的方法是加上所有跳跃连接,正如前一张幻灯片中看到的,每两层增加一个捷径,构成一个残差块。如图所示,5 个残差块连接在一起构成一个残差网络。

在这里插入图片描述

如果我们使用标准优化算法训练一个普通网络,比如说梯度下降法,或者其它热门的优化算法。如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。
也就是说,理论上网络深度越深越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。

但有了 ResNets 就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达 100 层的网络也不例外。有人甚至在 1000 多层的神经网络中做过实验,尽管目前我还没有看到太多实际应用。但是对𝑥的激活,或者这些中间的激活能够到达网络的更深层。这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看,随着网络越来深,网络连接会变得臃肿,但是 ResNet 确实在训练深度网络方面非常有效。

现在大家对 ResNet 已经有了一个大致的了解,通过本周的编程练习,你可以尝试亲自实现一下这些想法。至于为什么 ResNets 能有如此好的表现,接下来我会有更多更棒的内容分享给大家,我们下个视频见。

2.4 残差网络为什么有用?(Why ResNets work?)

为什么 ResNets 能有如此好的表现,我们来看个例子,它解释了其中的原因,至少可以说明,如何构建更深层次的 ResNets 网络的同时还不降低它们在训练集上的效率。希望你已经通过第三门课了解到,通常来讲,网络在训练集上表现好,才能在 Hold-Out 交叉验证集或 dev 集和测试集上有好的表现,所以至少在训练集上训练好 ResNets 是第一步。

先来看个例子,上节课我们了解到,一个网络深度越深,它在训练集上训练的效率就会有所减弱,这也是有时候我们不希望加深网络的原因。而事实并非如此,至少在训练 ResNets网络时,并非完全如此,举个例子。

在这里插入图片描述

假设有一个大型神经网络,其输入为𝑋,输出激活值 a [ l ] a^{[l]} a[l]。假如你想增加这个神经网络的深度,那么用 Big NN 表示,输出为 a [ l ] a^{[l]} a[l]。再给这个网络额外添加两层,依次添加两层,最后输出为 a [ l + 2 ] a^{[l+2]} a[l+2],可以把这两层看作一个 ResNets 块,即具有捷径连接的残差块。为了方便说明,假设我们在整个网络中使用 ReLU 激活函数,所以激活值都大于等于 0,包括输入𝑋的非零异常值。因为 ReLU 激活函数输出的数字要么是 0,要么是正数。

在这里插入图片描述

我们看一下 a [ l + 2 ] a^{[l+2]} a[l+2]的值,也就是上节课讲过的表达式,即 a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) a^{[l+2]} = g(z^{[l+2]} + a^{[l]}) a[l+2]=g(z[l+2]+a[l]),添加项 a [ l ] a^{[l]} a[l]是刚添加的跳跃连接的输入。展开这个表达式 a [ l + 2 ] = g ( W [ l + 2 ] a [ l + 1 ] + b [ l + 2 ] + a [ l ] ) a^{[l+2]} = g(W^{[l+2]}a^{[l+1]} +b^{[l+2]} + a^{[l]}) a[l+2]=g(W[l+2]a[l+1]+b[l+2]+a[l]),其中 z [ l + 2 ] = W [ l + 2 ] a [ l + 1 ] + b [ l + 2 ] z^{[l+2]} = W^{[l+2]}a^{[l+1]} + b^{[l+2]} z[l+2]=W[l+2]a[l+1]+b[l+2]。注意一点,如果使用 L2 正则化或权重衰减,它会压缩 W [ l + 2 ] W^{[l+2]} W[l+2]的值。如果对𝑏应用权重衰减也可达到同样的效果,尽管实际应用中,你有时会对𝑏应用权重衰减,有时不会。这里的𝑊是关键项,如果 W [ l + 2 ] W^{[l+2]} W[l+2] = 0,为方便起见,假设 b [ l + 2 ] b^{[l+2]} b[l+2] = 0,这几项就没有了,因为它们( W [ l + 2 ] a [ l + 1 ] + b [ l + 2 ] W^{[l+2]}a^{[l+1]} + b^{[l+2]} W[l+2]a[l+1]+b[l+2])的值为 0。最后 a [ l + 2 ] = g ( a [ l ] ) = a [ l ] a^{[l+2]} = g(a^{[l]}) = a^{[l]} a[l+2]=g(a[l])=a[l],因为我们假定使用 ReLU 激活函数,并且所有激活值都是非负的, g ( a [ l ] ) g(a^{[l]}) g(a[l])是应用于非负数的 ReLU函数,所以 a [ l + 2 ] = a [ l ] a^{[l+2]} = a^{[l]} a[l+2]=a[l]

在这里插入图片描述
结果表明,残差块学习这个恒等式函数并不难,跳跃连接使我们很容易得出 a [ l + 2 ] = a [ l ] a^{[l+2]} = a^{[l]} a[l+2]=a[l]。这意味着,即使给神经网络增加了这两层,它的效率也并不逊色于更简单的神经网络,因为学习恒等函数对它来说很简单。尽管它多了两层,也只把 a [ l ] a^{[l]} a[l]的值赋值给 a [ l + 2 ] a^{[l+2]} a[l+2]。所以给大型神经网络增加两层,不论是把残差块添加到神经网络的中间还是末端位置,都不会影响网络的表现。

在这里插入图片描述

当然,我们的目标不仅仅是保持网络的效率,还要提升它的效率。想象一下,如果这些隐藏层单元学到一些有用信息,那么它可能比学习恒等函数表现得更好。而这些不含有残差块或跳跃连接的深度普通网络情况就不一样了,当网络不断加深时,就算是选用学习恒等函数的参数都很困难,所以很多层最后的表现不但没有更好,反而更糟。

我认为残差网络起作用的主要原因就是这些残差块学习恒等函数非常容易,你能确定网络性能不会受到影响,很多时候甚至可以提高效率,或者说至少不会降低网络的效率,因此创建类似残差网络可以提升网络性能。

在这里插入图片描述

除此之外,关于残差网络,另一个值得探讨的细节是,假设 z [ l + 2 ] z^{[l+2]} z[l+2] a [ l ] a^{[l]} a[l]具有相同维度,所以 ResNets 使用了许多 same 卷积,所以这个 a [ l ] a^{[l]} a[l]的维度等于这个输出层的维度。之所以能实现跳跃连接是因为 same 卷积保留了维度,所以很容易得出这个捷径连接,并输出这两个相同维度的向量。

如果输入和输出有不同维度,比如输入的维度是 128, a [ l + 2 ] a^{[l+2]} a[l+2]的维度是 256,再增加一个矩阵,这里标记为 W s W_s Ws W s W_s Ws是一个 256×128 维度的矩阵,所以 W s a [ l ] W_sa^{[l]} Wsa[l]的维度是 256,这个新增项是 256 维度的向量。你不需要对 W s W_s Ws做任何操作,它是网络通过学习得到的矩阵或参数,它是一个固定矩阵,padding 值为 0,用 0 填充 a [ l ] a^{[l]} a[l],其维度为 256,所以者几个表达式都可以。

在这里插入图片描述
最后,我们来看看 ResNets 的图片识别。这些图片是我从何凯明等人论文中截取的,这是一个普通网络,我们给它输入一张图片,它有多个卷积层,最后输出了一个 Softmax。

在这里插入图片描述
如何把它转化为 ResNets 呢?只需要添加跳跃连接。这里我们只讨论几个细节,这个网络有很多层 3×3 卷积,而且它们大多都是 same 卷积,这就是添加等维特征向量的原因。所以这些都是卷积层,而不是全连接层,因为它们是 same 卷积,维度得以保留,这也解释了添加项 z [ l + 2 ] + a [ l ] z^{[l+2]} + a^{[l]} z[l+2]+a[l](维度相同所以能够相加)。

在这里插入图片描述
ResNets 类似于其它很多网络,也会有很多卷积层,其中偶尔会有池化层或类池化层的层。不论这些层是什么类型,正如我们在上一张幻灯片看到的,你都需要调整矩阵𝑊𝑠的维度。普通网络和 ResNets 网络常用的结构是:卷积层-卷积层-卷积层-池化层-卷积层-卷积层-卷积层-池化层……依此重复。直到最后,有一个通过 softmax 进行预测的全连接层。

以上就是 ResNets 的内容。使用 1×1 的过滤器,即 1×1 卷积,这个想法很有意思,为什么呢?我们下节课再讲。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149272.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在虚幻引擎中实时显示帧率

引擎自带了显示帧率的功能 但是只能在编辑器中显示 , 在游戏发布后就没有了 , 所以我们要自己做一个 创建一个控件蓝图 创建画布和文本 , 修改文本 文本绑定函数 , 点击创建绑定 添加一个名为 FPS 的变量 格式化文本 用大括号把变量包起来 {FPS Int} FPS 然后转到事件图表…

RHCS认证-Linux(RHel9)-Ansible

文章目录 一、ansible 简介二 、ansible部署三、ansible服务端测试四 、ansible 清单inventory五、Ad-hot 点对点模式六、YAML语言模式七、RHCS-Ansible附:安装CentOS-Stream 9系统7.1 ansible 执行过程7.2 安装ansible,ansible-navigator7.2 部署ansibl…

一看就会!PS2024下载安装教程详解

PS2024下载方法: PS2024安装教程: 1、右击【PS2024.zip】,选择【解压到PS2024】 2、右击【Set-up.exe】,选择【以管理员身份运行】 3、点击右下角灰色的小文件夹图标,选择【更改位置】 4、选择安装路径后,…

策略模式与工厂模式的区别

《策略模式与工厂模式的区别》 策略模式(Strategy Pattern) 和 工厂模式(Factory Pattern) 都是常见的设计模式,虽然它们在设计目标上有一些相似之处,如解耦代码、增强扩展性,但它们的应用场景和…

数字化转型中的供应链管理优化

在当今全球化和数字化的浪潮下,企业供应链管理面临着前所未有的挑战和机遇,企业在数字化转型过程中,如何优化供应链管理成为提升竞争力的关键。通过应用先进技术如RPA机器人流程自动化、大数据分析、物联网等,企业可以显著提高物流…

go解决引入私有包报错“Repository owner does not exist“的两种方式

当你写好引入的私有包,执行go mod tidy报错: Gogs: Repository owner does not exist fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 目前我的两种解决方案: 一、拉群整个…

基于WebServer的工业数据采集系统

一、项目框架及流程 二、http简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于Web Browser(浏览器)到Web Server(服务器)进行数据交互的传输协议。 HTTP是应用层协…

C/C++语言基础--C++构造函数、析构函数、深拷贝与浅拷贝等等相关知识讲解

本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 周末休息了,没有更新,请大家见谅哈;构造函数、析构函数可以说便随着C每一个程序,故学构造函数、析构函数是必要的;C语言后面也会继续更新知识点&am…

计算机的错误计算(一百零二)

摘要 探讨 的计算精度问题。 从计算机的错误计算(九十九)可知, 在IEEE 754-2019的列表中。因此,有必要分析其计算准确度。 例1. 已知 计算 若利用 Python的SciPy库中函数计算,则有: 若用Java的pow函…

通过 LabVIEW 正则表达式读取数值(整数或小数)

在LabVIEW开发中,字符串处理是一个非常常见的需求,尤其是在处理包含复杂格式的数字时。本文通过一个具体的例子来说明如何利用 Match Regular Expression Function 和 Match Pattern Function 读取并解析字符串中的数字,并重点探讨这两个函数…

毕业设计选题:基于ssm+vue+uniapp的英语学习激励系统小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

达梦-华为鲲鹏ARM架构下性能测试最佳实践

一、测试综述 1.1 测试目的 本次测试的目的是验证达梦数据库,在鲲鹏服务器下,不同服务器参数基于sysbench性能压力测试的表现。本次参数是根据为华为鲲鹏arm服务器调优十板斧内建议值调整 成长地图-鲲鹏开发套件开发文档-鲲鹏社区 1.2 通用指标 指标…

虚幻蓝图Ai随机点移动

主要函数: AI MoveTo 想要AI移动必须要有 导航网格体边界体积 (Nav Mesh Bounds Volume) , 放到地上放大 , 然后按P键 , 可以查看范围 然后创建一个character类 这样连上 AI就会随机运动了 为了AI移动更自然 , 取消使用控制器旋转Yaw 取消角色移动组件 的 使用控制器所需的…

关于Cursor使用的小白第一视角

最近看破局感觉洋哥总是提到cursor,感觉好火,所以打算学习一下怎么用Cursor,如果可以希望能做一个我自己的网站。 之前从来没用过Cursor。所以,这是一篇小白视角的Cursor使用教程。 如果你也是一个小白,并且对Cursor…

ArcGIS Desktop使用入门(三)图层右键工具——拓扑(上篇:地图拓扑)

系列文章目录 ArcGIS Desktop使用入门(一)软件初认识 ArcGIS Desktop使用入门(二)常用工具条——标准工具 ArcGIS Desktop使用入门(二)常用工具条——编辑器 ArcGIS Desktop使用入门(二&#x…

Maven配置及使用

1. Maven简介和安装 1.1. Maven是一个依赖管理工具 问题: jar包的规模 随着使用框架越来越多,或框架的封装程度越来越高,项目中使用的jar包也越来越多。项目中,一个模块里用到上百个jar包是非常正常的jar包的来源 jar包所属技术…

LeetCode 面试经典150题 201.数字范围按位与

题目&#xff1a;给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 提示&#xff1a;0 < left < right < 2^31 - 1 思路&#xff1a; 位与的特性…

《一本书讲透Elasticsearch》读书笔记(二)

Elasticsearch集群部署 Elastic Stack集群部署基础知识 Elasticsearch、Logstash、Beats、Kibana全部都支持跨平台部署 集群部署平台及操作系统的选型 可供选择的部署平台包括实体服务器、虚拟机&#xff08;VMWare、OpenStack等&#xff09;​、容器化平台&#xff08;Doc…

链式队列操作

文章目录 &#x1f34a;自我介绍&#x1f34a;概述&#x1f34a;链式队列代码linkstack.clinkstack.hmain.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&…

课程表-LeetCode100

现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在选修课程 ai 前 必须 先选修 bi 。 例如&#xff0c;想要学习课程 0 &#xff0c;你需要先完成课程 1…