《动手学深度学习2.0》学习笔记(二)
《动手学深度学习2.0》电子书的链接地址为https://zh.d2l.ai/index.html
本文记录了我在学习本书5-7章节(包括深度学习计算、卷积神经网络、现代卷积神经网络)过程中的理解和收获。
笔记首次发布于我的博客https://valoray.github.io/,排版比优快云稍好看一些,但内容是一致的。
深度学习计算
-
块(block)
- 一个块可以由许多层组成;一个块可以由许多块组成。
- 从编程的角度来看,块由类(class)表示。 每个块都必须定义一个将其输入转换为输出的前向传播函数, 并且必须存储任何必需的参数。
-
Sequential
类:用于把多个模块顺序地串起来 -
参数是复合的对象,包含值、梯度和额外信息。如何访问参数参考https://zh.d2l.ai/chapter_deep-learning-computation/parameters.html
-
参数初始化
-
加载和保存张量
x = torch.arange(4) torch.save(x,"x-file") load_x = torch.load("x-file")
-
加载和保存模型参数
这里保存的是模型的参数而不是保存整个模型。 因为模型本身可以包含任意代码,所以模型本身难以序列化。 因此,要想恢复模型,我们需要用代码生成架构, 然后从磁盘加载参数。
# 保存模型参数 torch.save(net.state_dict(), 'mlp.params')
# 恢复模型 clone = MLP() # 先生成模型的架构 clone.load_state_dict(torch.load('mlp.params')) #再恢复模型的参数
卷积神经网络
从全连接层到卷积
空间不变性
- 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。图像的平移不变性使我们以相同的方式处理局部图像,而不在乎它的位置。
- 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。局部性意味着计算相应的隐藏表示只需一小部分局部图像像素。
图像卷积
-
卷积相关概念
- 卷积核(convolution kernel),又叫滤波器(filter)、该卷积层的权重,作用是:通过仅查看“输入-输出对”来学习由X生成Y
- 卷积层:
- 可以指代应用卷积核的网络层
- 也可以指代图像经过卷积核计算后的输出(即“输出的卷积层”),此时等价于特征映射(feature map),或特征图
- 卷积层被训练的参数包括:卷积核权重、标量权重
-
神经网络中的卷积运算实际对应数学上的互相关运算(cross-correlation)
-
感受野(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的所有四个元素,而输入的感受野包括最初所有九个输入元素。因此,当一个特征图中的任意元素需要检测更广区域的输入特征时,我们可以构建一个更深的网络。
-
填充(padding):旨在保留边界信息
-
步幅(stride):当原始分辨率十分冗余时,加大步幅可以缩减采样次数,加快计算
-
怎么确定卷积操作相关的各种值?
-
设置卷积核大小(kernel size)——(kh,kw)
- 通常选奇数1,3,5,7…,目的是:padding通常按照如下规则设置ph=kh-1,pw=kw-1,kernel size选择奇数,ph,pw就能成为偶数,就能使填充时上下填充同样的行数、左右填充同样的列数,比较对称
-
设置填充(padding)
- 目的:通常是为了使输入和输出具有相同的高度和宽度,从而更易预测每个图层的输出形状
- 一般设置:ph=kh-1,pw=kw-1,这里ph代表上下填充的总行数,pw代表左右填充的总列数
- 在Python编程中,参数padding通常指的是上或下填充的行数(or 左或右填充的列数),也就是说ph=2xpadding
-
设置步长(stride)
- stride=2,高/宽步长都设置为2,则输入高/宽都减半(输出时)
-
求解输出形状
⌊ ( 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. ⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋.
如果设置了 p h = k h − 1 p_h=k_h-1 ph=kh
-