提交 69e3ce16 编写于 作者: A Aston Zhang

1.5.0b20181215

上级 bb91c566
......@@ -10,7 +10,7 @@ dependencies:
- nbsphinx==0.3.5
- recommonmark==0.4.0
- https://github.com/mli/notedown/tarball/master
- mxnet-cu92==1.2.0
- mxnet-cu92==1.5.0b20181215
- gluonbook==0.8.5
- jieba==0.39
- awscli
......@@ -147,7 +147,7 @@ source activate gluon
```
pip uninstall mxnet
pip install mxnet-cu90==1.2.0 # 指定本书代码依赖的版本号。
pip install mxnet-cu90==X.Y.Z # X.Y.Z 应替换为本书代码依赖的版本号。
```
## 运行Jupyter记事本
......
......@@ -228,7 +228,7 @@ def train_with_data_aug(train_augs, test_augs, lr=0.001):
loss = gloss.SoftmaxCrossEntropyLoss()
train_iter = load_cifar10(True, train_augs, batch_size)
test_iter = load_cifar10(False, test_augs, batch_size)
train(train_iter, test_iter, net, loss, trainer, ctx, num_epochs=10)
train(train_iter, test_iter, net, loss, trainer, ctx, num_epochs=8)
```
### 有关图像增广的对比实验
......
......@@ -194,8 +194,6 @@ print('output bbox preds:', bbox_preds.shape)
```{.python .input n=14}
batch_size = 32
train_data, test_data = gb.load_data_pikachu(batch_size)
# 为保证 GPU 计算效率,这里为每张训练图像填充了两个标签为 -1 的边界框。
train_data.reshape(label_shape=(3, 5))
```
在皮卡丘数据集中,目标的类别数为1。定义好模型以后,我们需要初始化模型参数并定义优化算法。
......
......@@ -42,7 +42,7 @@ mydict2
## 读写Gluon模型的参数
除了NDArray以外,我们还可以读写Gluon模型的参数。Gluon的Block类提供了`save_params``load_params`函数来读写模型参数(较新版本的MXNet,如1.2.1版,则使用`save_parameters``load_parameters`函数)。为了演示方便,我们先创建一个多层感知机,并将其初始化。回忆[“模型参数的延后初始化”](deferred-init.md)一节,由于延后初始化,我们需要先运行一次前向计算才能实际初始化模型参数。
除了NDArray以外,我们还可以读写Gluon模型的参数。Gluon的Block类提供了`save_parameters``load_parameters`函数来读写模型参数。为了演示方便,我们先创建一个多层感知机,并将其初始化。回忆[“模型参数的延后初始化”](deferred-init.md)一节,由于延后初始化,我们需要先运行一次前向计算才能实际初始化模型参数。
```{.python .input n=6}
class MLP(nn.Block):
......@@ -64,14 +64,14 @@ y = net(x)
```{.python .input}
filename = 'mlp.params'
net.save_params(filename)
net.save_parameters(filename)
```
接下来,我们再实例化一次定义好的多层感知机。跟随机初始化模型参数不同,我们在这里直接读取保存在文件里的参数。
```{.python .input n=8}
net2 = MLP()
net2.load_params(filename)
net2.load_parameters(filename)
```
因为这两个实例都有同样的模型参数,那么对同一个输入`x`的计算结果将会是一样。我们来验证一下。
......
......@@ -28,7 +28,7 @@
本书的一大特点是每一节的代码都是可以运行的。你可以改动代码后重新运行,并通过运行结果进一步理解改动所带来的影响。我们认为这种交互式的学习体验对于学习深度学习非常重要。因为深度学习目前并没有很好的理论解释框架,很多论断只可意会。文字解释在这时候可能比较苍白无力,而且不足以覆盖所有细节。你需要通过不断改动代码、观察运行结果并进行经验总结,逐步领悟和掌握深度学习。
本书的代码基于Apache MXNet实现。MXNet是一个开源的深度学习框架。它是AWS(亚马逊云计算服务)首选的深度学习框架,也被众多学校和公司使用。本书所有代码已在MXNet 1.2.0下测试通过。但由于深度学习发展极为迅速,未来版本的MXNet可能会造成书中部分代码无法正常运行。遇到类似问题可参考[“获取和运行本书代码”](../chapter_prerequisite/install.md)一节来更新代码和运行环境。此外,为避免重复描述,我们将本书中多次使用的函数和类封装在版本号为1.0.0的`gluonbook`包中。这些函数和类的定义所在章节已在附录[“gluonbook包索引”](../chapter_appendix/gluonbook.md)里列出
本书的代码基于Apache MXNet实现。MXNet是一个开源的深度学习框架。它是AWS(亚马逊云计算服务)首选的深度学习框架,也被众多学校和公司使用。为避免重复描述,我们将本书中多次使用的函数和类封装在`gluonbook`包中。这些函数和类的定义所在章节已在附录[“gluonbook包索引”](../chapter_appendix/gluonbook.md)里列出。由于深度学习发展极为迅速,未来版本的MXNet可能会造成书中部分代码无法正常运行。遇到相关问题可参考[“获取和运行本书代码”](../chapter_prerequisite/install.md)一节来更新代码和运行环境。如果你想了解运行本书代码所依赖的MXNet和`gluonbook`包的版本号,也可参考[“获取和运行本书代码”](../chapter_prerequisite/install.md)一节
本书可以作为MXNet入门教程使用。但我们提供代码的主要目的在于增加一个在文字、图像和公式外的学习深度学习算法的方式,以及一个便于理解各算法在真实数据上实际效果的交互式环境。书中只使用了MXNet的`ndarray``autograd``gluon`等模块的基础功能,使你尽可能了解深度学习算法的实现细节。即便你在研究和工作中使用了其他深度学习框架,书中的代码也能帮助你更好地理解深度学习算法。
......
......@@ -48,8 +48,9 @@ glove_6b50d.token_to_idx['beautiful'], glove_6b50d.idx_to_token[3367]
```{.python .input}
def knn(W, x, k):
# 添加的 1e-9 是为了数值稳定性。
cos = nd.dot(W, x.reshape((-1,))) / (
nd.sum(W * W, axis=1).sqrt() * nd.sum(x * x).sqrt())
(nd.sum(W * W, axis=1) + 1e-9).sqrt() * nd.sum(x * x).sqrt())
topk = nd.topk(cos, k=k, ret_typ='indices').asnumpy().astype('int32')
return topk, [cos[i].asscalar() for i in topk]
```
......@@ -59,8 +60,8 @@ def knn(W, x, k):
```{.python .input}
def get_similar_tokens(query_token, k, embed):
topk, cos = knn(embed.idx_to_vec,
embed.get_vecs_by_tokens([query_token]), k+2)
for i, c in zip(topk[2:], cos[2:]): # 除去输入词和未知词。
embed.get_vecs_by_tokens([query_token]), k+1)
for i, c in zip(topk[1:], cos[1:]): # 除去输入词。
print('cosine sim=%.3f: %s' % (c, (embed.idx_to_token[i])))
```
......@@ -88,8 +89,8 @@ get_similar_tokens('beautiful', 3, glove_6b50d)
def get_analogy(token_a, token_b, token_c, embed):
vecs = embed.get_vecs_by_tokens([token_a, token_b, token_c])
x = vecs[1] - vecs[0] + vecs[2]
topk, cos = knn(embed.idx_to_vec, x, 2)
return embed.idx_to_token[topk[1]] # 除去未知词。
topk, cos = knn(embed.idx_to_vec, x, 1)
return embed.idx_to_token[topk[0]]
```
验证下“男-女”类比。
......
......@@ -6,6 +6,7 @@
```{.python .input n=1}
import collections
import gluonbook as gb
import math
from mxnet import autograd, gluon, nd
from mxnet.gluon import data as gdata, loss as gloss, nn
......@@ -285,13 +286,15 @@ net.add(nn.Embedding(input_dim=len(idx_to_token), output_dim=embed_size),
```{.python .input n=23}
def train(net, lr, num_epochs):
net.initialize(force_reinit=True)
ctx = gb.try_gpu()
net.initialize(ctx=ctx, force_reinit=True)
trainer = gluon.Trainer(net.collect_params(), 'adam',
{'learning_rate': lr})
for epoch in range(num_epochs):
start_time, train_l_sum = time.time(), 0
for batch in data_iter:
center, context_negative, mask, label = batch
center, context_negative, mask, label = [
data.as_in_context(ctx) for data in batch]
with autograd.record():
pred = skip_gram(center, context_negative, net[0], net[1])
# 使用掩码变量 mask 来避免填充项对损失函数计算的影响。
......@@ -319,7 +322,8 @@ train(net, 0.005, 3)
def get_similar_tokens(query_token, k, embed):
W = embed.weight.data()
x = W[token_to_idx[query_token]]
cos = nd.dot(W, x) / nd.sum(W * W, axis=1).sqrt() / nd.sum(x * x).sqrt()
# # 添加的 1e-9 是为了数值稳定性。
cos = nd.dot(W, x) / (nd.sum(W * W, axis=1) * nd.sum(x * x) + 1e-9).sqrt()
topk = nd.topk(cos, k=k+1, ret_typ='indices').asnumpy().astype('int32')
for i in topk[1:]: # 除去输入词。
print('cosine sim=%.3f: %s' % (cos[i].asscalar(), (idx_to_token[i])))
......@@ -336,6 +340,7 @@ get_similar_tokens('chip', 3, net[0])
## 练习
* 在创建`nn.Embedding`实例时设参数`sparse_grad=True`,训练是否可以加速?查阅MXNet文档,了解该参数的意义。
* 我们用`batchify`函数指定`DataLoader`实例中小批量的读取方式,并打印了读取的第一个批量中各个变量的形状。这些形状该如何计算得到?
* 试着找出其他词的近义词。
* 调一调超参数,观察并分析实验结果。
......
......@@ -28,7 +28,7 @@ conda config --prepend channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pk
conda config --prepend channels http://mirrors.ustc.edu.cn/anaconda/pkgs/free/
```
接下来使用conda创建虚拟(运行)环境并安装本书需要的软件。这里`environment.yml`是放置在代码压缩包中的文件,它指定了执行本书代码所需要的软件
接下来使用conda创建虚拟(运行)环境并安装本书需要的软件。这里`environment.yml`是放置在代码压缩包中的文件,它指定了运行本书(代码压缩包中)代码所依赖的软件及版本号
```
conda env create -f environment.yml
......
......@@ -6,5 +6,5 @@ dependencies:
- pandas=0.23.2
- pip:
- requests==2.18.4
- mxnet==1.2.0
- mxnet==1.5.0b20181215
- gluonbook==0.8.5
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册