《动手学深度学习2.0》学习笔记(二)

《动手学深度学习2.0》学习笔记(二)

《动手学深度学习2.0》电子书的链接地址为https://zh.d2l.ai/index.html

本文记录了我在学习本书5-7章节(包括深度学习计算、卷积神经网络、现代卷积神经网络)过程中的理解和收获。

笔记首次发布于我的博客https://valoray.github.io/,排版比CSDN稍好看一些,但内容是一致的。

深度学习计算

  1. 块(block)

    • 一个块可以由许多层组成;一个块可以由许多块组成。
    • 从编程的角度来看,块由(class)表示。 每个块都必须定义一个将其输入转换为输出的前向传播函数, 并且必须存储任何必需的参数。
  2. Sequential类:用于把多个模块顺序地串起来

  3. 参数是复合的对象,包含值、梯度和额外信息。如何访问参数参考https://zh.d2l.ai/chapter_deep-learning-computation/parameters.html

  4. 参数初始化

  5. 加载和保存张量

    x = torch.arange(4)
    torch.save(x,"x-file")
    load_x = torch.load("x-file")
    
  6. 加载和保存模型参数

    这里保存的是模型的参数而不是保存整个模型。 因为模型本身可以包含任意代码,所以模型本身难以序列化。 因此,要想恢复模型,我们需要用代码生成架构, 然后从磁盘加载参数。

    # 保存模型参数
    torch.save(net.state_dict(), 'mlp.params')
    
    # 恢复模型
    clone = MLP() # 先生成模型的架构
    clone.load_state_dict(torch.load('mlp.params')) #再恢复模型的参数
    

卷积神经网络

从全连接层到卷积

空间不变性

  • 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。图像的平移不变性使我们以相同的方式处理局部图像,而不在乎它的位置。
  • 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。局部性意味着计算相应的隐藏表示只需一小部分局部图像像素。

图像卷积

卷积运算

  1. 卷积相关概念

    • 卷积核(convolution kernel),又叫滤波器(filter)、该卷积层的权重,作用是:通过仅查看“输入-输出对”来学习由X生成Y
    • 卷积层
      • 可以指代应用卷积核的网络层
      • 也可以指代图像经过卷积核计算后的输出(即“输出的卷积层”),此时等价于特征映射(feature map),或特征图
    • 卷积层被训练的参数包括:卷积核权重、标量权重
  2. 神经网络中的卷积运算实际对应数学上的互相关运算(cross-correlation)

  3. 感受野(receptive field)

    以图1为例来解释感受野:给定 2 × 2 2\times2 2×2卷积核,阴影输出元素值19的感受野是输入阴影部分的四个元素。假设之前输出为 Y \mathbf{Y} Y, 其大小为 2 × 2 2\times2 2×2,现在我们在其后附加一个卷积层,该卷积层以 Y \mathbf{Y} Y为输入,输出单个元素 z z z。在这种情况下, Y \mathbf{Y} Y上的 z z z的感受野包括 Y \mathbf{Y} Y的所有四个元素,而输入的感受野包括最初所有九个输入元素。因此,当一个特征图中的任意元素需要检测更广区域的输入特征时,我们可以构建一个更深的网络。

  4. 填充(padding):旨在保留边界信息

  5. 步幅(stride):当原始分辨率十分冗余时,加大步幅可以缩减采样次数,加快计算

  6. 怎么确定卷积操作相关的各种值?

    1. 设置卷积核大小(kernel size)——(kh,kw)

      • 通常选奇数1,3,5,7…,目的是:padding通常按照如下规则设置ph=kh-1,pw=kw-1,kernel size选择奇数,ph,pw就能成为偶数,就能使填充时上下填充同样的行数、左右填充同样的列数,比较对称
    2. 设置填充(padding)

      • 目的:通常是为了使输入和输出具有相同的高度和宽度,从而更易预测每个图层的输出形状
      • 一般设置:ph=kh-1,pw=kw-1,这里ph代表上下填充的总行数,pw代表左右填充的总列数
      • 在Python编程中,参数padding通常指的是上或下填充的行数(or 左或右填充的列数),也就是说ph=2xpadding
    3. 设置步长(stride)

      • stride=2,高/宽步长都设置为2,则输入高/宽都减半(输出时)
    4. 求解输出形状
      ⌊ ( n h − k h + p h + s h ) / s h ⌋ × ⌊ ( n w − k w + p w + s w ) / s w ⌋ . \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor\times\lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor. ⌊(nhkh+ph+sh)/sh×⌊(nwkw+pw+sw)/sw.
      如果设置了 p h = k h − 1 p_h=k_h-1 ph=kh1 p w = k w − 1 p_w=k_w-1 pw=kw1,则输出形状将简化为
      ⌊ ( n h + s h − 1 ) / s h ⌋ × ⌊ ( n w + s w − 1 ) / s w ⌋ \lfloor(n_h+s_h-1)/s_h\rfloor\times\lfloor(n_w+s_w-1)/s_w\rfloor ⌊(nh+sh1)/sh×⌊(nw+sw1)/sw

多输入多输出通道

多输入通道

两个输入通道的互相关计算

假设输入的通道数为 c i c_i ci,那么卷积核的输入通道数也需要为 c i c_i ci,因此卷积核的窗口形状是 c i × k h × k w c_i\times k_h\times k_w ci×kh×kw

当输入通道>1,输出通道=1时,进 行互相关运算包括两个步骤:

  1. 每个通道输入的二维张量和卷积核的二维张量进行互相关运算
  2. 对通道求和(将 c i c_i ci的结果相加)得到二维张量
多输出通道

在最流行的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。直观地说,我们可以将每个通道看作对不同特征的响应。而现实可能更为复杂一些,因为每个通道不是独立学习的,而是为了共同使用而优化的。因此,多输出通道并不仅是学习多个单通道的检测器。

c i c_i ci c o c_o co分别表示输入和输出通道的数目,并让 k h k_h kh k w k_w kw为卷积核的高度和宽度。为了获得多个通道的输出,我们可以为每个输出通道创建一个形状为 c i × k h × k w c_i\times k_h\times k_w ci×kh×kw的卷积核张量,这样卷积核的形状 c o × c i × k h × k w c_o\times c_i\times k_h\times k_w co×ci×kh×kw。在互相关运算中,每个输出通道先获取所有输入通道,再以对应该输出通道的卷积核
计算出结果。

  • 卷积核的形状是 c o × c i × k h × k w c_o\times c_i\times k_h\times k_w co×ci×kh×kw,可以理解为有 c o c_o co套卷积核,每个卷积核的维度为 c i × k h × k w c_i\times k_h\times k_w ci×kh×kw,因此每个卷积核的输出为一个二维张量, c o c_o co套卷积核的输出就为 c o c_o co套二维张量,堆叠起来就是“多个”输出通道 c o c_o co
1x1卷积层

互相关计算使用了具有3个输入通道和2个输出通道的1×1卷积核。其中,输入和输出具有相同的高度和宽度。

  1. 特点:失去了在高度和宽度维度上,识别相邻元素间相互作用的能力(卷积层的特有能力)

  2. 用途:调整通道数量,用来将 c i c_i ci个输入值转换为 c o c_o co个输出值,可看作在每个像素位置应用的全连接层

  3. 1x1卷积层的权重维度为 c o × c i c_o\times c_i co×ci,再额外加上一个偏置。

    这里的 c o c_o co表示有 c o c_o co套1x1卷积核, c i c_i ci代表卷积核自身的通道数要和输入的通道数相同。(换句话说,这里等价于说卷积核的形状是 c o × c i × 1 × 1 c_o\times c_i\times 1\times 1 co×ci×1×1

汇聚层pooling

  1. 目的:降低卷积层对位置的敏感性,同时降低对空间下采样表示的敏感性。
  2. 特点:
    • 不包含参数,运算是确定的(maximum or average pooling)
    • pooling层的输出通道数与输入通道数相同
  3. 使用注意:默认情况下,pooling窗口的大小与步幅相同

LeNet

LeNet是最早发布的卷积神经网络之一(1989年)

  1. LeNet(LeNet-5)由两个部分组成:

    • 卷积编码器:由两个卷积层组成;

    • 全连接层密集块:由三个全连接层组成。

  2. LeNet使用了sigmoid激活函数

  3. LeNet使用了权重衰减来控制全连接层的模型复杂度

LeNet架构图

现代卷积神经网络

2012年前后,如何表征图像特征的观点发生了进化。2012年前,图像特征都是机械计算出来的,2012年后新的观点涌动起来——特征本身应该是被学习的

现代卷积神经网络:

  • AlexNet。它是第一个在大规模视觉竞赛中击败传统计算机视觉模型的大型神经网络;
  • 使用重复块的网络(VGG)。它利用许多重复的神经网络块;
  • 网络中的网络(NiN)。它重复使用由卷积层和1×1卷积层(用来代替全连接层)来构建深层网络;
  • 含并行连结的网络(GoogLeNet)。它使用并行连结的网络,通过不同窗口大小的卷积层和最大汇聚层来并行抽取信息;
  • 残差网络(ResNet)。它通过残差块构建跨层的数据通道,是计算机视觉中最流行的体系架构;
  • 稠密连接网络(DenseNet)。它的计算成本很高,但给我们带来了更好的效果。

AlexNet

  1. AlexNet由八层组成:五个卷积层、两个全连接隐藏层和一个全连接输出层。
  2. AlexNet使用ReLU作为其激活函数。
  3. AlexNet通过dropout控制全连接层的模型复杂度

AlexNet架构图

使用块的网络VGG

  1. VGG网络可以分为两部分:第一部分主要由卷积层和汇聚层组成,第二部分由全连接层组成。
  2. 原始VGG网络有5个卷积块,其中前两个块各有一个卷积层,后三个块各包含两个卷积层。

VGG架构

LeNet、AlexNet和VGG都有一个共同的设计模式:通过一系列的卷积层与汇聚层来提取空间结构特征;然后通过全连接层对特征的表征进行处理。 AlexNet和VGG对LeNet的改进主要在于如何扩大和加深这两个模块。

网络中的网络NiN

卷积层的输入和输出由四维张量组成,张量的每个轴分别对应样本、通道、高度和宽度。另外,全连接层的输入和输出通常是分别对应于样本和特征的二维张量。NiN的想法是在每个像素位置 (针对每个高度和宽度) 应用一个全连接层。如果我们将权重连接到每个空间位置,我们可以将其视为 1 × 1 1\times1 1×1卷积层 , 或作为在每个像素位置上独立作用的全连接层。从另一个角度看,即将空间维度中的每个像素视为单个样本,将通道维度视为不同特征 (feature) 。

NiN块以一个普通卷积层开始,后面是两个 1 × 1 1\times1 1×1的卷积层。这两个 1 × 1 1\times1 1×1卷积层充当带有ReLU激活函数的逐像素全连接层。第一层的卷积窗口形状通常由用户设置。随后的卷积窗口形状固定为 1 × 1 1\times1 1×1

NiN和AlexNet之间的一个显著区别是NiN完全取消了全连接层。 相反,NiN使用一个NiN块,其输出通道数等于标签类别的数量。最后放一个全局平均汇聚层(global average pooling layer),生成一个对数几率 (logits)。NiN设计的一个优点是,它显著减少了模型所需参数的数量。然而,在实践中,这种设计有时会增加训练模型的时间。

NiN的架构

含并行连结的网络GoogLeNet

Inception块

Inception块的架构

如图所示,Inception块由四条并行路径组成。前三条路径使用窗口大小为 1 × 1 × 3 × 3 1\times1\times3\times3 1×1×3×3 5 × 5 5\times5 5×5的卷积层,从不同空间大小中提取信息。中间的两条路径在输入上执行 1 × 1 1\times1 1×1卷积,以减少通道数,从而降低模型的复杂性。第四条路径使用 3 × 3 3\times3 3×3最大汇聚层,然后使用 1 × 1 1\times1 1×1卷积层来改变通道数。这四条路径都使用合适的填充来使输入与输出的高和宽一致,最后我们将每条线路的输出在通道维度上连结,并构成Inception块的输出。在Inception块中,通常调整的超参数是每层输出通道数。

GoogLeNet模型

GoogLeNet一共使用9个Inception块和全局平均汇聚层的堆叠来生成其估计值。Inception块之间的最大汇聚层可降低维度。

GoogLeNet架构

批量规范化

批量规范化

批量规范化应用于单个可选层(也可以应用到所有层),其原理如下:在每次训练迭代中,我们首先规范化输入,即通过减去其均值并除以其标准差,其中两者均基于当前小批量处理。 接下来,我们应用比例系数和比例偏移。

从形式上来说,用 x ∈ B \mathbf{x}\in\mathcal{B} xB表示一个来自小批量 B \mathcal{B} B的输入,批量规范化BN根据以下表达式转换 x : \mathbf{x}: x:
B N ( x ) = γ ⊙ x − μ ^ B σ ^ B + β . \mathrm{BN}(\mathbf{x})=\boldsymbol{\gamma}\odot\frac{\mathbf{x}-\hat{\boldsymbol{\mu}}_{\mathcal{B}}}{\hat{\boldsymbol{\sigma}}_{\mathcal{B}}}+\boldsymbol{\beta}. BN(x)=γσ^Bxμ^B+β.

μ ^ B \hat{\mu}_{B} μ^B是小批量 B \mathcal{B} B的样本均值, σ ^ B \hat{\sigma}_{B} σ^B是小批量 B \mathcal{B} B的样本标准差。应用标准化后,生成的小批量的平均值为0和单位方差为1。由于单位方差 (与其他一些魔法数) 是一个主观的选择,因此我们通常包含拉伸参数(scale) γ \gamma γ和偏移参数(shift) β \beta β,它们的形状与x相同。 γ \gamma γ β \beta β是需要与其他模型参数一起学习的参数。

  • 批量规范化层和dropout层一样,在训练模式和预测模式下计算不同。

批量规范化层在”训练模式“(通过小批量统计数据规范化)和“预测模式”(通过数据集统计规范化)中的功能不同。 在训练过程中,我们无法得知使用整个数据集来估计平均值和方差,所以只能根据每个小批次的平均值和方差不断训练模型。 而在预测模式下,可以根据整个数据集精确计算批量规范化所需的平均值和方差。

批量规范化层

批量规范化和其他层之间的一个关键区别是,由于批量规范化在完整的小批量上运行,因此我们不能像以前在引入其他层时那样忽略批量大小。 我们在下面讨论这两种情况:全连接层和卷积层,他们的批量规范化实现略有不同

全连接层

将批量规范化层置于全连接层中的仿射变换和激活函数之间。设全连接层的输入为x,权重参数和偏置参数分别为 W \mathbf{W} W和b,激活函数为 ϕ \phi ϕ,批量规范化的运算符为BN。那么,使用批量规范化的全连接层的输出的计算详情如下:
h = ϕ ( B N ( W x + b ) ) . \mathbf{h}=\phi(\mathrm{BN}(\mathbf{W}\mathbf{x}+\mathbf{b})). h=ϕ(BN(Wx+b)).

卷积层

对于卷积层,在卷积层之后和非线性激活函数之前应用批量规范化。

当卷积有多个输出通道时,我们需要对这些通道的“每个”输出执行批量规范化,每个通道都有自己的拉伸 (scale) 和偏移(shift) 参数,这两个参数都是标量。假设我们的小批量包含 m m m个样本,并且对于每个通道,卷积的输出具有高度 p p p和宽度 q q q。那么对于卷积层,我们在每个输出通道的 m ⋅ p ⋅ q m\cdot p\cdot q mpq个元素上同时执行每个批量规范化。因此,在计算平均值和方差时,我们会收集所有空间位置的值,然后在给定通道内应用相同的均值和方差,以便在每个空间位置对值进行规范化。

预测过程中的批量归一化

通过移动平均估算整个训练数据集的样本均值和方差,并在预测时使用它们得到确定的输出。

残差网络ResNet

残差块

在残差块中,输入可通过跨层数据线路更快地向前传播。

一个正常块(左图)和一个残差块(右图)

ResNet的残差块里:

  1. 首先有2个有相同输出通道数的 3 × 3 3\times3 3×3卷积层。每个卷积层后接一个批量规范化层和ReLU激活函数。
  2. 然后我们通过跨层数据通路,跳过这2个卷积运算,将输入直接加在最后的ReLU激活函数前。这样要求2个卷积层的输出与输入形状一样,从而使它们可以相加。
  3. 如果想改变通道数,就需要引入一个额外的 1 × 1 1\times1 1×1卷积层来将输入变换成需要的形状后再做相加运算。

残差块的实现如下:

包含以及不包含 1×1 卷积层的残差块

ResNet模型
  1. ResNet使用了4个大模块,每个大模块使用了若干相同输出通道数的残差块。
  2. 第一个模块的输出通道数同输入通道数一致。 由于之前已经使用了步幅为2的最大汇聚层,所以无须减小高和宽。
  3. 之后的每个模块在第一个残差块里将上一个模块的通道数翻倍,并将高和宽减半。

ResNet-18 架构

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 动手深度学习v2是一本非常好的深度学习教材,是从谷歌机器学习研究员李沐所主持的Gluon团队创作的。它提供了丰富的案例和实际应用,深入浅出地介绍了深度学习的基础理论和实践技能。 下载动手深度学习v2非常简单,可以通过访问官方网站来获取。首先,打开谷歌或百度搜索引擎,搜索"动手深度学习v2下载",就可以找到相关的下载链接。建议选择官网下载,因为官网下载最为安全可靠。 进入官网后,点击首页上的"下载"按钮,然后在目录下找到本书的下载链接,下载适合你的版本即可。此外,动手深度学习v2还有在线阅读的版本,方便学习者随时随地学习。 总的来说,动手深度学习v2是一本非常优秀的深度学习教材,相关下载链接也十分便捷,能够帮助广大学习者更好地掌握深度学习相关的知识和技能。 ### 回答2: 动手深度学习v2是一本非常优秀的深度学习入门书籍,笔者十分推荐。如果您想要下载该书籍,可以使用以下方法: 1.进入动手深度学习v2的官网(https://zh.d2l.ai/),点击右上角的“Github”按钮,进入书籍的Github仓库。 2.在仓库中找到“releases”目录,选择最新的版本号,点击进入。 3.在该版本的页面中,找到“Source code (zip)”或“Source code (tar.gz)”选项,点击下载压缩包。 4.下载完成后,解压缩文件即可得到电子书的文件夹,其中包括PDF和HTML格式的书籍。 除此之外,您也可以在该官网中找到由中文社区翻译的在线电子书版本。在该电子书中,您可以直接在线阅读和学习。值得注意的是,该书籍的在线翻译版本可能会比英文原版稍有滞后。如果您想要阅读最新的内容,请下载英文原版或者在该官网上查看最新的更新。 ### 回答3: 学习深度学习是现在的热门话题之一。而动手深度学习v2是一本非常好的深度学习教材,旨在为做实际项目的学习者提供知识技能和实战经验。为了下载此书,您需要按照以下步骤进行。 首先,您需要访问动手深度学习官方网站,网址为d2l.ai。然后,您需要找到下载页面,这个页面可以通过页面上的“全书下载”按钮或主页面上的一个标签来访问。 在下载页面,您需要选择您所需要的版本,v2版本是最新版本。接着,您需要选择您所需的格式。您可以选择PDF格式或HTML格式,下方还提供了在线阅读链接。 若您选择了PDF格式,则需要点击下载链接,页面会跳到GitHub仓库中。在GitHub页面,您需要选择ZIP文件并下载。下载完成后,您就可以在本地解压并阅读这本书了。 若您选择了HTML格式,则不需下载,只需点击在线阅读链接即可。页面会跳转到包含书籍所有章节、实例代码、作者笔记等信息的HTML页面,您可以任意阅读或者下载章节(在左侧点击对应章节)。 总之,动手深度学习v2是一本亲身实践的深度学习教材,其深入浅出的讲解以及丰富的实战案例,能够帮助初者快速掌握深度学习这一技术,同时也是深度学习领域专业人士的必备读物。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值