吴恩达深度学习笔记:卷积神经网络(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.rhkb.cn/news/431191.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE: 深入探索TCP网络编程的奇妙世界(一)

文章目录 TCPTCP协议段落格式TCP相关机制TCP核心机制一: 确认应答32位序号32位确认序号后发先至问题 TCP TCP要比UDP更复杂一些~ TCP的全称为"传输控制协议".他负责对数据的传输进行一个详细的控制. TCP协议段落格式 源/目的端口号: 表示数据是从哪个进程来.到哪个…

Python 如何处理大文件的读取

Python 如何处理大文件的读取 在日常的开发工作中,我们经常会遇到处理大文件的需求。无论是读取日志文件、处理数据集,还是分析超大文本文件,大文件操作都是一个非常常见的挑战。尤其是在内存有限的环境中,直接将整个文件加载到内…

Docker配置代理解决pull超时问题

操作系统: CentOS Linux 8 Docker版本: 26.1.3 前置:你需拥有🐱 1. 配置 proxy.conf 1.1 创建配置文件目录 创建 docker.service.d,进入到 docker.service.d 中打开 proxy.conf (没有文件打开会自动创建)。 注意:每个人的路径可…

深度学习|误差逆传播:梯度速解

文章目录 引言链式法则误差逆传播加法的逆传播乘法的逆传播逆传播求梯度 SoftmaxWithLoss 层正向传播逆传播代码实现参考 结语 引言 我们知道训练神经网络模型的核心是以损失函数为基准来调整优化网络参数,使得网络的输出尽可能接近真实标签。在神经网络中&#xf…

Vue使用qrcodejs2-fix生成网页二维码

安装qrcodejs2-fix npm install qrcodejs2-fix核心代码 在指定父view中生成一个二维码通过id找到父布局 //通过id找到父布局let codeView document.getElementById("qrcode")new QRCode(codeView, {text: "测试",width: 128,height: 128,colorDark: #00…

Fyne ( go跨平台GUI )中文文档-小部件 (五)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

LeetcodeTop100 刷题总结(二)

LeetCode 热题 100:https://leetcode.cn/studyplan/top-100-liked/ 文章目录 八、二叉树94. 二叉树的中序遍历(递归与非递归)补充:144. 二叉树的前序遍历(递归与非递归)补充:145. 二叉树的后序遍…

移动数组中数字的方法(c语言)

1.移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。 例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。 移动后,一维数组中的内容应为:5,6,7,8…

qm 命令:管理PVE虚拟机

一、命令简介 ​qm​ 是 Proxmox Virtual Environment (PVE) 中用于管理虚拟机的命令行工具。它允许用户创建、启动、停止、删除虚拟机,以及管理虚拟机的配置和状态。 ‍ 介绍 PVE Proxmox Virtual Environment (PVE) 是一个开源的虚拟化管理平台,专…

设计模式 享元模式(Flyweight Pattern)

享元模式 简绍 享元模式(Flyweight Pattern)是一种结构型设计模式,它的目的是通过共享技术来有效地支持大量细粒度的对象。享元模式可以极大地减少内存的使用,从而提高程序的性能。它特别适用于需要创建大量相似对象的场景&#…

QT 数据加密

一.使用环境 应该是通用的,此测试版本为如图 二.使用代码 1. 运行代码 QString data = "123abcAbc.-+";qDebug() << "加密:" << QAESEncryption::encodedText(data, "填入自己秘钥");qDebug() << "解密:" <…

C++STL的Stack的使用:STL栈和队列的使用介绍、leecode---最小栈、nowcoder---栈的压入、弹出序列等的介绍

文章目录 前言一、STL栈和队列的使用二、leetcode---最小栈三、nowcoder---栈的压入、弹出序列四、逆波兰表达式求值总结 前言 CSTL的Stack的使用&#xff1a;STL栈和队列的使用介绍、leecode—最小栈、nowcoder—栈的压入、弹出序列等的介绍 一、STL栈和队列的使用 #include …

服务器安装pytorch_geometric torch_scatter踩坑记录

conda create -n pyg python3.8.12 pip install torch1.13.0安装的版本如下 pip install torch-scatter pip install torch-sparse pip install torch-cluster pip install torch-spline-conv pip install torch-geometric2.2.0 pip install ipykernel python -m ipykernel i…

Adobe Illustrator吸管工具提取的颜色与原色之间存在色差

问题原因&#xff1a; 被提取颜色的对象是外部链接图片&#xff0c;对其提取的颜色会与AI中看到的颜色不同 如下图所示&#xff0c;中间的矩形与外部矩形的内部颜色存在色差 解决办法&#xff1a; 方法一&#xff1a;将该外部图片利用屏幕截图的形式&#xff0c;粘贴到AI中。…

2.以太网

局域网 局域网: Local Area Networks (LAN) 网络大小分类 局域网园区网(可以理解为企业网)城域网 广域网是一个网络连接的技术&#xff0c;并非多大范围的网络 网关 为局域网内的用户提供了一扇门&#xff0c;通过网关可以访问到别的网络。这个门&#xff0c;就叫网关 以…

部标(JT/T1078)流媒体对接说明

1.前言 最近在配合客户开发流媒体相关的服务的时候&#xff0c;整理了一些对接过程资料&#xff0c;这里做个分享与记录。流媒体的对接主要牵扯到4个方面&#xff1a; &#xff08;1&#xff09;平台端&#xff1a;业务端系统&#xff0c;包含前端呈现界面。 &#xff08;2&a…

物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——STM32代码实现篇

STM32代码实现 开启本章节需要完成下方的前置任务&#xff1a; 点击跳转&#xff1a; 物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 目标 1.连接OneNET&#xff1a;STM32使用串口与ESP8266/01s连接发送…

Linux网络命令:用于请求和配置网络地址的命令dhclient详解

目录 一、概述 二、功能描述 三、基本使用 1. 命令格式 2. 常用选项 3. 获取帮助 ​编辑 4. 基本操作 四、工作原理 1. 发送DHCP请求 2. 接收DHCP响应 3. 请求IP地址 4. 确认IP地址 5. 配置网络接口 五、功能特点 六、配置文件 七、常用命令和示例 1、启动…

QT客户端发送HTTP请求此时服务器到底收到了哪些数据?

一个Http请求包括 请求行 请求头 空行 请求体 下面是示例&#xff1a; 1,2,3,4分别代表上面的四个部分&#xff0c;我只是做了一些解析&#xff0c;具体可以结合代码 1. post / HTTP/1.1 2.GET请求头包括Host(主机名),user-agent&#xff08;客户端标识符&#xff09;&am…

SiMBA:基于FFT变换和Mamba的图像分类模型算法解析

目录 1 算法原理1 EinFFT&#xff1a;1.1 频谱变换1.2 频域通道混频 & 频谱门控网络1.3 逆频谱变换 2 整体计算公式3 SiMBA&#xff1a;4 小结 2 代码大致逻辑EinFFT模块MambaBlock模块MambaLayer模块PVT2FFN和FFN模块ClassBlock和Block_mamba模块DownSamples模块Stem模块定…