Skip to content

Commit 26fd28c

Browse files
authored
ch3 && elementwise->按元素 & 偏差->偏置 (#685)
1 parent f293fac commit 26fd28c

File tree

30 files changed

+105
-105
lines changed

30 files changed

+105
-105
lines changed

chapter_attention-mechanisms/transformer.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ enc_attention_weights = d2l.reshape(
558558
enc_attention_weights.shape
559559
```
560560

561-
在编码器的自我注意中,查询和键来自相同的输入序列。由于填充令牌不具有意义,并且输入序列的指定有效长度,因此没有查询参与填充令牌的位置。在以下内容中,将逐行呈现两层多头注意力权重。每位负责人都根据查询、键和值的单独表示子空间独立出席。
561+
在编码器的自我注意中,查询和键来自相同的输入序列。由于填充令牌不具有意义,并且输入序列的指定有效长度,因此没有查询参与填充令牌的位置。在以下内容中,将按行呈现两层多头注意力权重。每位负责人都根据查询、键和值的单独表示子空间独立出席。
562562

563563
```{.python .input}
564564
d2l.show_heatmaps(

chapter_convolutional-modern/alexnet.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33

44
在LeNet提出后,卷积神经网络在计算机视觉和机器学习领域中很有名气。但卷积神经网络并没有主导这些领域。这是因为虽然 LeNet 在小数据集上取得了很好的效果,但是在更大、更真实的数据集上训练卷积神经网络的性能和可行性还有待研究。事实上,在上世纪90年代初到2012年之间的大部分时间里,神经网络往往被其他机器学习方法超越,如支持向量机(support vector machines)。
55

6-
在计算机视觉中,直接将神经网络与其他机器学习方法进行比较也许不公平。这是因为,卷积神经网络的输入是由原始像素值或是经过简单预处理(例如居中、缩放)的像素值组成的。但在使用传统机器学习方法时,从业者永远不会将原始像素作为输入。在传统机器学习方法中,计算机视觉工作流是由经过人的手工精心设计的特征工作流组成的。对于这些传统方法,大部分的进展都来自于对特征有了更聪明的想法,并且学习到的算法往往归于事后的解释。
6+
在计算机视觉中,直接将神经网络与其他机器学习方法进行比较也许不公平。这是因为,卷积神经网络的输入是由原始像素值或是经过简单预处理(例如居中、缩放)的像素值组成的。但在使用传统机器学习方法时,从业者永远不会将原始像素作为输入。在传统机器学习方法中,计算机视觉流水线是由经过人的手工精心设计的特征流水线组成的。对于这些传统方法,大部分的进展都来自于对特征有了更聪明的想法,并且学习到的算法往往归于事后的解释。
77

88
虽然上世纪90年代就有了一些神经网络加速器,但仅靠它们还不足以开发出有大量参数的深层多通道多层卷积神经网络。此外,当时的数据集仍然相对较小。除了这些障碍,训练神经网络的一些关键技巧仍然缺失,包括启发式参数初始化、随机梯度下降的巧妙变体、非挤压激活函数和有效的正则化技术。
99

10-
因此,与训练*端到端*(从像素到分类结果)系统不同,经典机器学习的工作流看起来更像下面这样
10+
因此,与训练*端到端*(从像素到分类结果)系统不同,经典机器学习的流水线看起来更像下面这样
1111

1212
1. 获取一个有趣的数据集。在早期,收集这些数据集需要昂贵的传感器(在当时最先进的图像也就100万像素)。
1313
2. 根据光学、几何学、其他知识以及偶然的发现,手工对特征数据集进行预处理。
14-
3. 通过标准的特征提取算法(如SIFT(尺度不变特征变换) :cite:`Lowe.2004` 、SURF(加速鲁棒特征) :cite:`Bay.Tuytelaars.Van-Gool.2006` 或其他手动调整的工作流来输入数据
14+
3. 通过标准的特征提取算法(如SIFT(尺度不变特征变换) :cite:`Lowe.2004` 、SURF(加速鲁棒特征) :cite:`Bay.Tuytelaars.Van-Gool.2006` 或其他手动调整的流水线来输入数据
1515
4. 将提取的特征放到最喜欢的分类器中(例如线性模型或其它核方法),以训练分类器。
1616

1717
如果你和机器学习研究人员交谈,你会发现他们相信机器学习既重要又美丽:优雅的理论去证明各种模型的性质。机器学习是一个正在蓬勃发展、严谨且非常有用的领域。然而,如果你和计算机视觉研究人员交谈,你会听到一个完全不同的故事。他们会告诉你图像识别的诡异事实————推动领域进步的是数据特征,而不是学习算法。计算机视觉研究人员相信,从对最终模型精度的影响来说,更大或更干净的数据集、或是稍微改进的特征提取,比任何学习算法带来的进步要大得多。

chapter_convolutional-modern/batch-norm.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ $$\begin{aligned} \hat{\boldsymbol{\mu}}_\mathcal{B} &= \frac{1}{|\mathcal{B}|}
7272
### 全连接层
7373

7474
通常,我们将批量归一化层置于全连接层中的仿射变换和激活函数之间。
75-
设全连接层的输入为 u ,权重参数和偏差参数分别为 $\mathbf{W}$ 和 $\mathbf{b}$ ,激活函数为 $\phi$ ,批量归一化的运算符为 $\mathrm{BN}$ 。
75+
设全连接层的输入为 u ,权重参数和偏置参数分别为 $\mathbf{W}$ 和 $\mathbf{b}$ ,激活函数为 $\phi$ ,批量归一化的运算符为 $\mathrm{BN}$ 。
7676
那么,使用批量归一化的全连接层的输出的计算详情如下:
7777

7878
$$\mathbf{h} = \phi(\mathrm{BN}(\mathbf{W}\mathbf{x} + \mathbf{b}) ).$$
@@ -500,7 +500,7 @@ Ali Rahimi 在接受 2017 年 NeurIPS 大会的“接受时间考验奖”(Tes
500500

501501
## 练习
502502

503-
1. 在使用批量归一化之前,我们是否可以从全连接层或卷积层中删除偏差参数?为什么?
503+
1. 在使用批量归一化之前,我们是否可以从全连接层或卷积层中删除偏置参数?为什么?
504504
1. 比较LeNet在使用和不使用批量归一化情况下的学习率。
505505
1. 绘制训练和测试准确度的提高。
506506
1. 你的学习率有多高?

chapter_convolutional-modern/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 深度卷积神经网络
1+
# 现代卷积神经网络
22
:label:`chap_modern_cnn`
33

44
上一章我们介绍了卷积神经网络的基本原理,本章我们将带你了解现代的卷积神经网络结构,许多现代卷积神经网络的研究都是建立在这一章的基础上的。

chapter_convolutional-modern/resnet.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
## 函数类
99

1010
首先,假设有一类特定的神经网络结构 $\mathcal{F}$,它包括学习速率和其他超参数设置。
11-
对于所有 $f \in \mathcal{F}$,存在一些参数集(例如权重和偏差),这些参数可以通过在合适的数据集上进行训练而获得。
11+
对于所有 $f \in \mathcal{F}$,存在一些参数集(例如权重和偏置),这些参数可以通过在合适的数据集上进行训练而获得。
1212
现在假设 $f^*$ 是我们真正想要找到的函数,如果是 $f^* \in \mathcal{F}$,那我们可以轻而易举的训练得到它,但通常我们不会那么幸运。
1313
相反,我们将尝试找到一个函数 $f^*_\mathcal{F}$,这是我们在 $\mathcal{F}$ 中的最佳选择。
1414
例如,给定一个具有 $\mathbf{X}$ 特性和 $\mathbf{y}$ 标签的数据集,我们可以尝试通过解决以下优化问题来找到它:
@@ -43,7 +43,7 @@ $$f^*_\mathcal{F} := \mathop{\mathrm{argmin}}_f L(\mathbf{X}, \mathbf{y}, f) \te
4343
让我们聚焦于神经网络局部:如图 :numref:`fig_residual_block` 所示,假设我们的原始输入为 $x$ ,而希望学出的理想映射为 $f(\mathbf{x})$ (作为 :numref:`fig_residual_block` 上方激活函数的输入)。
4444
:numref:`fig_residual_block` 左图虚线框中的部分需要直接拟合出该映射 $f(\mathbf{x})$ ,而右图虚线框中的部分则需要拟合出残差映射 $f(\mathbf{x}) - \mathbf{x}$ 。
4545
残差映射在现实中往往更容易优化。
46-
以本节开头提到的恒等映射作为我们希望学出的理想映射 $f(\mathbf{x})$ ,我们只需将 :numref:`fig_residual_block` 中右图虚线框内上方的加权运算(如仿射)的权重和偏差参数设成 0,那么 $f(\mathbf{x})$ 即为恒等映射。
46+
以本节开头提到的恒等映射作为我们希望学出的理想映射 $f(\mathbf{x})$ ,我们只需将 :numref:`fig_residual_block` 中右图虚线框内上方的加权运算(如仿射)的权重和偏置参数设成 0,那么 $f(\mathbf{x})$ 即为恒等映射。
4747
实际中,当理想映射 $f(\mathbf{x})$ 极接近于恒等映射时,残差映射也易于捕捉恒等映射的细微波动。
4848
:numref:`fig_residual_block` 右图是 ResNet 的基础结构-- *残差块*(residual block)。
4949
在残差块中,输入可通过跨层数据线路更快地向前传播。

chapter_convolutional-neural-networks/channels.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ $1 \times 1$ 卷积,即 $k_h = k_w = 1$,看起来似乎没有多大意义。
105105
这里输入和输出具有相同的高度和宽度,输出中的每个元素都是从输入图像中同一位置的元素的线性组合。
106106
我们可以将 $1\times 1$ 卷积层看作是在每个像素位置应用的全连接层,以 $c_i$ 个输入值转换为 $c_o$ 个输出值。
107107
因为这仍然是一个卷积层,所以跨像素的权重是一致的。
108-
同时,$1\times 1$ 卷积层需要的权重维度为 $c_o\times c_i$ ,再额外加上一个偏差
108+
同时,$1\times 1$ 卷积层需要的权重维度为 $c_o\times c_i$ ,再额外加上一个偏置
109109

110110

111111
![互相关计算使用了具有3个输入通道和2个输出通道的 $1\times 1$ 卷积核。其中,输入和输出具有相同的高度和宽度。](../img/conv-1x1.svg)

chapter_convolutional-neural-networks/conv-layer.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
:label:`fig_correlation`
1515

1616
在二维互相关运算中,卷积窗口从输入张量的左上角开始,从左到右、从上到下滑动。
17-
当卷积窗口滑动到新一个位置时,包含在该窗口中的部分张量与卷积核张量进行逐元素相乘,得到的张量再求和得到一个单一的标量值,由此我们得出了这一位置的输出张量值。
17+
当卷积窗口滑动到新一个位置时,包含在该窗口中的部分张量与卷积核张量进行按元素相乘,得到的张量再求和得到一个单一的标量值,由此我们得出了这一位置的输出张量值。
1818
在如上例子中,输出张量的四个元素由二维互相关运算得到,这个输出高度为 $2$ 、宽度为 $2$ ,如下所示:
1919

2020
$$
@@ -86,11 +86,11 @@ corr2d(X, K)
8686

8787
## 卷积层
8888

89-
卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏差之后产生输出
90-
所以,卷积层中的两个被训练的参数是卷积核权重和标量偏差
89+
卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏置之后产生输出
90+
所以,卷积层中的两个被训练的参数是卷积核权重和标量偏置
9191
就像我们之前随机初始化全连接层一样,在训练基于卷积层的模型时,我们也随机初始化卷积核权重
9292

93-
基于上面定义的 `corr2d` 函数实现二维卷积层。在 `__init__` 构造函数中,将 `weight``bias` 声明为两个模型参数。前向传播函数调用 `corr2d` 函数并添加偏差
93+
基于上面定义的 `corr2d` 函数实现二维卷积层。在 `__init__` 构造函数中,将 `weight``bias` 声明为两个模型参数。前向传播函数调用 `corr2d` 函数并添加偏置
9494

9595
```{.python .input}
9696
class Conv2D(nn.Block):
@@ -185,7 +185,7 @@ corr2d(d2l.transpose(X), K)
185185
如果我们只需寻找黑白边缘,那么以上 `[1, -1]` 的边缘检测器足以。然而,当有了更复杂数值的卷积核,或者连续的卷积层时,我们不可能手动设计过滤器。那么我们是否可以学习由 `X` 生成 `Y` 的卷积核呢?
186186

187187
现在让我们看看是否可以通过仅查看“输入-输出”对来了解由 `X` 生成 `Y` 的卷积核。
188-
我们先构造一个卷积层,并将其卷积核初始化为随机张量。接下来,在每次迭代中,我们比较 `Y` 与卷积层输出的平方误差,然后计算梯度来更新卷积核。为了简单起见,我们在此使用内置的二维卷积层,并忽略偏差
188+
我们先构造一个卷积层,并将其卷积核初始化为随机张量。接下来,在每次迭代中,我们比较 `Y` 与卷积层输出的平方误差,然后计算梯度来更新卷积核。为了简单起见,我们在此使用内置的二维卷积层,并忽略偏置
189189

190190
```{.python .input}
191191
# 构造一个二维卷积层,它具有1个输出通道和形状为(1,2)的卷积核
@@ -305,7 +305,7 @@ d2l.reshape(conv2d.get_weights()[0], (1, 2))
305305

306306
## 小结
307307

308-
* 二维卷积层的核心计算是二维互相关运算。最简单的形式是,对二维输入数据和卷积核执行互相关操作,然后添加一个偏差
308+
* 二维卷积层的核心计算是二维互相关运算。最简单的形式是,对二维输入数据和卷积核执行互相关操作,然后添加一个偏置
309309
* 我们可以设计一个卷积核来检测图像的边缘。
310310
* 我们可以从数据中学习卷积核的参数。
311311
* 学习卷积核时,无论用严格卷积运算或互相关运算,卷积层的输出不会受太大影响。

chapter_convolutional-neural-networks/why-conv.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ $$[\mathbf{H}]_{i, j} = u + \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Del
8181
简而言之, :eqref:`eq_conv-layer` 是一个卷积层,而卷积神经网络是包含卷积层的一类特殊的神经网络。
8282
在深度学习研究社区中, $\mathbf{V}$ 被称为 *卷积核* (convolution kernel) 或者 *滤波器* (filter),是可学习的权重。
8383
当图像处理的局部区域很小时,卷积神经网络与多层感知机的训练差异可能是巨大的:以前,多层感知机可能需要数十亿个参数来表示,而现在卷积神经网络通常只需要几百个参数,而且不需要改变输入或隐藏表示的维数。
84-
以上所有的权重学习都依赖于归纳偏差,当这种偏差与实际情况相符时,我们就可以得到有效的模型,这些模型能很好地推广到不可见的数据中。
84+
以上所有的权重学习都依赖于归纳偏置,当这种偏置与实际情况相符时,我们就可以得到有效的模型,这些模型能很好地推广到不可见的数据中。
8585
但如果这些假设与实际情况不符,比如当图像不满足平移不变时,我们的模型可能难以拟合。
8686

8787

chapter_deep-learning-computation/custom-layer.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ tf.reduce_mean(Y)
105105

106106
既然我们知道了如何定义简单的层,那么让我们继续定义具有参数的层,这些参数可以通过训练进行调整。我们可以使用内置函数来创建参数,这些参数提供一些基本的管理功能。比如管理访问、初始化、共享、保存和加载模型参数。这样做的好处之一是,我们不需要为每个自定义层编写自定义序列化程序。
107107

108-
现在,让我们实现自定义版本的全连接层。回想一下,该层需要两个参数,一个用于表示权重,另一个用于表示偏差项。在此实现中,我们使用ReLU作为激活函数。该层需要输入参数:`in_units``units`,分别表示输入和输出的数量。
108+
现在,让我们实现自定义版本的全连接层。回想一下,该层需要两个参数,一个用于表示权重,另一个用于表示偏置项。在此实现中,我们使用ReLU作为激活函数。该层需要输入参数:`in_units``units`,分别表示输入和输出的数量。
109109

110110
```{.python .input}
111111
class MyDense(nn.Block):

chapter_deep-learning-computation/parameters.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,11 @@ print(net[2].state_dict())
6666
print(net.layers[2].weights)
6767
```
6868

69-
输出的结果告诉我们一些重要的事情。首先,这个全连接层包含两个参数,分别是该层的权重和偏差。两者都存储为单精度浮点数(float32)。注意,参数名称允许我们唯一地标识每个参数,即使在包含数百个层的网络中也是如此。
69+
输出的结果告诉我们一些重要的事情。首先,这个全连接层包含两个参数,分别是该层的权重和偏置。两者都存储为单精度浮点数(float32)。注意,参数名称允许我们唯一地标识每个参数,即使在包含数百个层的网络中也是如此。
7070

7171
### 目标参数
7272

73-
注意,每个参数都表示为参数(parameter)类的一个实例。要对参数执行任何操作,首先我们需要访问底层的数值。有几种方法可以做到这一点。有些比较简单,而另一些则比较通用。下面的代码从第二个神经网络层提取偏差,提取后返回的是一个参数类实例,并进一步访问该参数的值。
73+
注意,每个参数都表示为参数(parameter)类的一个实例。要对参数执行任何操作,首先我们需要访问底层的数值。有几种方法可以做到这一点。有些比较简单,而另一些则比较通用。下面的代码从第二个神经网络层提取偏置,提取后返回的是一个参数类实例,并进一步访问该参数的值。
7474

7575
```{.python .input}
7676
print(type(net[1].bias))
@@ -224,7 +224,7 @@ print(rgnet)
224224
print(rgnet.summary())
225225
```
226226

227-
因为层是分层嵌套的,所以我们也可以像通过嵌套列表索引一样访问它们。例如,我们下面访问第一个主要的块,其中第二个子块的第一层的偏差项
227+
因为层是分层嵌套的,所以我们也可以像通过嵌套列表索引一样访问它们。例如,我们下面访问第一个主要的块,其中第二个子块的第一层的偏置项
228228

229229
```{.python .input}
230230
rgnet[0][1][0].bias.data()
@@ -249,7 +249,7 @@ rgnet.layers[0].layers[1].layers[1].weights[1]
249249
:end_tab:
250250

251251
:begin_tab:`pytorch`
252-
默认情况下,PyTorch会根据一个范围均匀地初始化权重和偏差矩阵,这个范围是根据输入和输出维度计算出的。PyTorch的`nn.init`模块提供了多种预置初始化方法。
252+
默认情况下,PyTorch会根据一个范围均匀地初始化权重和偏置矩阵,这个范围是根据输入和输出维度计算出的。PyTorch的`nn.init`模块提供了多种预置初始化方法。
253253
:end_tab:
254254

255255
:begin_tab:`tensorflow`

0 commit comments

Comments
 (0)