Skip to content

Commit

Permalink
[1e feedback] ch3 before mlp
Browse files Browse the repository at this point in the history
  • Loading branch information
astonzhang committed Jan 13, 2019
1 parent 48c00a5 commit c22eb20
Show file tree
Hide file tree
Showing 18 changed files with 107 additions and 106 deletions.
2 changes: 1 addition & 1 deletion chapter_appendix/d2lzh.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
* `train_2d`[梯度下降和随机梯度下降](../chapter_optimization/gd-sgd.md)
* `train_and_predict_rnn`[循环神经网络的从零开始实现](../chapter_recurrent-neural-networks/rnn-scratch.md)
* `train_and_predict_rnn_gluon `[循环神经网络的简洁实现](../chapter_recurrent-neural-networks/rnn-gluon.md)
* `train_ch3`[Softmax回归的从零开始实现](../chapter_deep-learning-basics/softmax-regression-scratch.md)
* `train_ch3`[softmax回归的从零开始实现](../chapter_deep-learning-basics/softmax-regression-scratch.md)
* `train_ch5`[卷积神经网络(LeNet)](../chapter_convolutional-neural-networks/lenet.md)
* `train_ch7`[小批量随机梯度下降](../chapter_optimization/minibatch-sgd.md)
* `train_gluon_ch7`[小批量随机梯度下降](../chapter_optimization/minibatch-sgd.md)
Expand Down
2 changes: 1 addition & 1 deletion chapter_computer-vision/image-augmentation.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ def _get_batch(batch, ctx):
gutils.split_and_load(labels, ctx), features.shape[0])
```

然后,我们定义`evaluate_accuracy`函数评价模型的分类准确率。与[Softmax回归的从零开始实现](../chapter_deep-learning-basics/softmax-regression-scratch.md)[“卷积神经网络(LeNet)”](../chapter_convolutional-neural-networks/lenet.md)两节中描述的`evaluate_accuracy`函数不同,这里定义的函数更加通用:它通过辅助函数`_get_batch`使用`ctx`变量所包含的所有GPU来评价模型。
然后,我们定义`evaluate_accuracy`函数评价模型的分类准确率。与[softmax回归的从零开始实现](../chapter_deep-learning-basics/softmax-regression-scratch.md)[“卷积神经网络(LeNet)”](../chapter_convolutional-neural-networks/lenet.md)两节中描述的`evaluate_accuracy`函数不同,这里定义的函数更加通用:它通过辅助函数`_get_batch`使用`ctx`变量所包含的所有GPU来评价模型。

```{.python .input n=36}
# 本函数已保存在d2lzh包中方便以后使用
Expand Down
4 changes: 2 additions & 2 deletions chapter_convolutional-neural-networks/lenet.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ ctx = try_gpu()
ctx
```

相应地,我们对[Softmax回归的从零开始实现](../chapter_deep-learning-basics/softmax-regression-scratch.md)一节中描述的`evaluate_accuracy`函数略作修改。由于数据刚开始存在CPU使用的内存上,当`ctx`变量代表GPU及相应的显存时,我们通过[“GPU计算”](../chapter_deep-learning-computation/use-gpu.md)一节中介绍的`as_in_context`函数将数据复制到显存上,例如`gpu(0)`
相应地,我们对[softmax回归的从零开始实现](../chapter_deep-learning-basics/softmax-regression-scratch.md)一节中描述的`evaluate_accuracy`函数略作修改。由于数据刚开始存在CPU使用的内存上,当`ctx`变量代表GPU及相应的显存时,我们通过[“GPU计算”](../chapter_deep-learning-computation/use-gpu.md)一节中介绍的`as_in_context`函数将数据复制到显存上,例如`gpu(0)`

```{.python .input}
# 本函数已保存在d2lzh包中方便以后使用。该函数将被逐步改进:它的完整实现将在“图像增广”一节中
Expand All @@ -90,7 +90,7 @@ def evaluate_accuracy(data_iter, net, ctx):
return acc_sum.asscalar() / n
```

我们同样对[Softmax回归的从零开始实现](../chapter_deep-learning-basics/softmax-regression-scratch.md)一节中定义的`train_ch3`函数略作修改,确保计算使用的数据和模型同在内存或显存上。
我们同样对[softmax回归的从零开始实现](../chapter_deep-learning-basics/softmax-regression-scratch.md)一节中定义的`train_ch3`函数略作修改,确保计算使用的数据和模型同在内存或显存上。

```{.python .input}
# 本函数已保存在d2lzh包中方便以后使用
Expand Down
2 changes: 1 addition & 1 deletion chapter_deep-learning-basics/dropout.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ dropout(X, 1)

### 定义模型参数

实验中,我们依然使用[Softmax回归——从零开始](softmax-regression-scratch.md)一节中介绍的Fashion-MNIST数据集。我们将定义一个包含两个隐藏层的多层感知机。其中两个隐藏层的输出个数都是256。
实验中,我们依然使用[softmax回归的从零开始实现](softmax-regression-scratch.md)一节中介绍的Fashion-MNIST数据集。我们将定义一个包含两个隐藏层的多层感知机。其中两个隐藏层的输出个数都是256。

```{.python .input}
num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256
Expand Down
16 changes: 8 additions & 8 deletions chapter_deep-learning-basics/fashion-mnist.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,19 @@ len(mnist_train), len(mnist_test)
feature, label = mnist_train[0]
```

变量`feature`对应高和宽均为28像素的图像。每个像素的数值为0到255之间8位无符号整数(uint8)。它使用3维的`NDArray`储存。其中的最后一维是通道数。因为数据集中是灰度图像,所以通道数为1。为了表述简洁,我们将高和宽分别为$h$和$w$像素的图像的形状记为$h \times w$或`(h,w)`
变量`feature`对应高和宽均为28像素的图像。每个像素的数值为0到255之间8位无符号整数(uint8)。它使用三维的`NDArray`存储。其中的最后一维是通道数。因为数据集中是灰度图像,所以通道数为1。为了表述简洁,我们将高和宽分别为$h$和$w$像素的图像的形状记为$h \times w$或`(h,w)`

```{.python .input}
feature.shape, feature.dtype
```

图像的标签使用NumPy的标量表示。它的类型为32位整数。
图像的标签使用NumPy的标量表示。它的类型为32位整数(int32)

```{.python .input}
label, type(label), label.dtype
```

Fashion-MNIST中一共包括了10个类别,分别为:t-shirt(T恤)、trouser(裤子)、pullover(套衫)、dress(连衣裙)、coat(外套)、sandal(凉鞋)、shirt(衬衫)、sneaker(运动鞋)、bag(包)和ankle boot(短靴)。以下函数可以将数值标签转成相应的文本标签。
Fashion-MNIST中一共包括了10个类别,分别为t-shirt(T恤)、trouser(裤子)、pullover(套衫)、dress(连衣裙)、coat(外套)、sandal(凉鞋)、shirt(衬衫)、sneaker(运动鞋)、bag(包)和ankle boot(短靴)。以下函数可以将数值标签转成相应的文本标签。

```{.python .input n=25}
# 本函数已保存在d2lzh包中方便以后使用
Expand Down Expand Up @@ -83,7 +83,7 @@ show_fashion_mnist(X, get_fashion_mnist_labels(y))

在实践中,数据读取经常是训练的性能瓶颈,特别当模型较简单或者计算硬件性能较高时。Gluon的`DataLoader`中一个很方便的功能是允许使用多进程来加速数据读取(暂不支持Windows操作系统)。这里我们通过参数`num_workers`来设置4个进程读取数据。

此外,我们通过`ToTensor`类将图像数据从uint8格式变换成32位浮点数格式,并除以255使得所有像素的数值均在0到1之间。`ToTensor`类还将图像通道从最后一维移到最前一维来方便之后介绍的卷积神经网络计算。通过数据集的`transform_first`函数,我们将`ToTensor`的变换应用在每个数据样本(图像和标签)的第一个元素,即图像之上。
此外,我们通过`ToTensor`实例将图像数据从uint8格式变换成32位浮点数格式,并除以255使得所有像素的数值均在0到1之间。`ToTensor`实例还将图像通道从最后一维移到最前一维来方便之后介绍的卷积神经网络计算。通过数据集的`transform_first`函数,我们将`ToTensor`的变换应用在每个数据样本(图像和标签)的第一个元素,即图像之上。

```{.python .input n=28}
batch_size = 256
Expand Down Expand Up @@ -114,15 +114,15 @@ for X, y in train_iter:

## 小结

* Fashion-MNIST是一个10类服饰分类数据集,之后章节里我们将使用它来检验不同算法的表现
* Fashion-MNIST是一个10类服饰分类数据集,之后章节里将使用它来检验不同算法的表现
* 我们将高和宽分别为$h$和$w$像素的图像的形状记为$h \times w$或`(h,w)`

## 练习

* 减小`batch_size`例如到1)会影响读取性能吗?
* 减小`batch_size`如到1)会影响读取性能吗?
* 非Windows用户请尝试修改`num_workers`来查看它对读取性能的影响。
* 查看MXNet文档,`gdata.vision`里还提供了哪些别的数据集?
* 查看MXNet文档,`gdata.vision.transforms`还提供了哪些别的变换方法?
* 查阅MXNet文档,`mxnet.gluon.data.vision`里还提供了哪些别的数据集?
* 查阅MXNet文档,`mxnet.gluon.data.vision.transforms`还提供了哪些别的变换方法?


## 扫码直达[讨论区](https://discuss.gluon.ai/t/topic/7760)
Expand Down
2 changes: 2 additions & 0 deletions chapter_deep-learning-basics/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

从本章开始,我们将探索深度学习的奥秘。作为机器学习的一类,深度学习通常基于神经网络模型逐级表示越来越抽象的概念或模式。我们先从线性回归和 softmax 回归这两种单层神经网络入手,简要介绍机器学习中的基本概念。然后,我们由单层神经网络延伸到多层神经网络,并通过多层感知机引入深度学习模型。在观察和了解了模型的过拟合现象后,我们将介绍深度学习中应对过拟合的常用方法:权重衰减和丢弃法。接着,为了进一步理解深度学习模型训练的本质,我们将详细解释正向传播和反向传播。掌握这两个概念后,我们能更好地认识深度学习中的数值稳定性和初始化的一些问题。最后,我们通过一个深度学习应用案例对本章内容学以致用。

在本章的前几节,我们先介绍单层神经网络:线性回归和softmax回归。

```eval_rst
.. toctree::
Expand Down
16 changes: 8 additions & 8 deletions chapter_deep-learning-basics/linear-regression-gluon.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 线性回归的简洁实现

随着深度学习框架的发展,开发深度学习应用变得越来越便利。实践中,我们通常可以用比上一节中更简洁的代码来实现同样的模型。本节中,我们将介绍如何使用MXNet提供的Gluon接口更方便地实现线性回归的训练。
随着深度学习框架的发展,开发深度学习应用变得越来越便利。实践中,我们通常可以用比上一节更简洁的代码来实现同样的模型。在本节中,我们将介绍如何使用MXNet提供的Gluon接口更方便地实现线性回归的训练。

## 生成数据集

Expand All @@ -20,7 +20,7 @@ labels += nd.random.normal(scale=0.01, shape=labels.shape)

## 读取数据

Gluon提供了`data`模块来读取数据。由于`data`常用作变量名,我们将导入的`data`模块用添加了Gluon首字母的假名`gdata`代替。在每一次迭代中,我们将随机读取包含10个数据样本的小批量。
Gluon提供了`data`包来读取数据。由于`data`常用作变量名,我们将导入的`data`模块用添加了Gluon首字母的假名`gdata`代替。在每一次迭代中,我们将随机读取包含10个数据样本的小批量。

```{.python .input n=3}
from mxnet.gluon import data as gdata
Expand All @@ -42,7 +42,7 @@ for X, y in data_iter:

## 定义模型

在上一节从零开始的实现中,我们需要定义模型参数,并使用它们一步步描述模型是怎样计算的。当模型结构变得更复杂时,这些步骤将变得更加繁琐。其实,Gluon提供了大量预定义的层,这使我们只需关注使用哪些层来构造模型。下面将介绍如何使用Gluon更简洁地定义线性回归。
在上一节从零开始的实现中,我们需要定义模型参数,并使用它们一步步描述模型是怎样计算的。当模型结构变得更复杂时,这些步骤将变得更繁琐。其实,Gluon提供了大量预定义的层,这使我们只需关注使用哪些层来构造模型。下面将介绍如何使用Gluon更简洁地定义线性回归。

首先,导入`nn`模块。实际上,“nn”是neural networks(神经网络)的缩写。顾名思义,该模块定义了大量神经网络的层。我们先定义一个模型变量`net`,它是一个`Sequential`实例。在Gluon中,`Sequential`实例可以看作是一个串联各个层的容器。在构造模型时,我们在该容器中依次添加层。当给定输入数据时,容器中的每一层将依次计算并将输出作为下一层的输入。

Expand All @@ -58,12 +58,12 @@ net = nn.Sequential()
net.add(nn.Dense(1))
```

值得一提的是,在Gluon中我们无需指定每一层输入的形状,例如线性回归的输入个数。当模型看见数据时,例如后面执行`net(X)`时,模型将自动推断出每一层的输入个数。我们将在之后“深度学习计算”一章详细介绍这个机制。Gluon的这一设计为模型开发带来便利。
值得一提的是,在Gluon中我们无须指定每一层输入的形状,例如线性回归的输入个数。当模型得到数据时,例如后面执行`net(X)`时,模型将自动推断出每一层的输入个数。我们将在之后“深度学习计算”一章详细介绍这种机制。Gluon的这一设计为模型开发带来便利。


## 初始化模型参数

在使用`net`前,我们需要初始化模型参数,例如线性回归模型中的权重和偏差。我们从MXNet导入`initializer`模块。该模块提供了模型参数初始化的各种方法。这里的`init``initializer`的缩写形式。我们通过`init.Normal(sigma=0.01)`指定权重参数每个元素将在初始化时随机采样于均值为0标准差为0.01的正态分布。偏差参数默认会初始化为零。
在使用`net`前,我们需要初始化模型参数,如线性回归模型中的权重和偏差。我们从MXNet导入`init`模块。该模块提供了模型参数初始化的各种方法。这里的`init``initializer`的缩写形式。我们通过`init.Normal(sigma=0.01)`指定权重参数每个元素将在初始化时随机采样于均值为0、标准差为0.01的正态分布。偏差参数默认会初始化为零。

```{.python .input n=7}
from mxnet import init
Expand All @@ -73,7 +73,7 @@ net.initialize(init.Normal(sigma=0.01))

## 定义损失函数

在Gluon中,`loss`模块定义了各种损失函数。我们用假名`gloss`代替导入的`loss`模块,并直接使用它所提供的平方损失作为模型的损失函数
在Gluon中,`loss`模块定义了各种损失函数。我们用假名`gloss`代替导入的`loss`模块,并直接使用它提供的平方损失作为模型的损失函数

```{.python .input n=8}
from mxnet.gluon import loss as gloss
Expand All @@ -83,7 +83,7 @@ loss = gloss.L2Loss() # 平方损失又称L2范数损失

## 定义优化算法

同样,我们也无需实现小批量随机梯度下降。在导入Gluon后,我们创建一个`Trainer`实例,并指定学习率为0.03的小批量随机梯度下降(`sgd`)为优化算法。该优化算法将用来迭代`net`实例所有通过`add`函数嵌套的层所包含的全部参数。这些参数可以通过`collect_params`函数获取。
同样,我们也无须实现小批量随机梯度下降。在导入Gluon后,我们创建一个`Trainer`实例,并指定学习率为0.03的小批量随机梯度下降(`sgd`)为优化算法。该优化算法将用来迭代`net`实例所有通过`add`函数嵌套的层所包含的全部参数。这些参数可以通过`collect_params`函数获取。

```{.python .input n=9}
from mxnet import gluon
Expand All @@ -107,7 +107,7 @@ for epoch in range(1, num_epochs + 1):
print('epoch %d, loss: %f' % (epoch, l.mean().asnumpy()))
```

下面我们分别比较学到的和真实的模型参数。我们从`net`获得需要的层,并访问其权重(`weight`)和偏差(`bias`)。学到的和真实的参数很接近
下面我们分别比较学到的模型参数和真实的模型参数。我们从`net`获得需要的层,并访问其权重(`weight`)和偏差(`bias`)。学到的参数和真实的参数很接近

```{.python .input n=12}
dense = net[0]
Expand Down
Loading

0 comments on commit c22eb20

Please sign in to comment.