diff --git a/build/env.yml b/build/env.yml index ade132558d8a1e04c988e8ed70b9caa98e1fb800..2a6deb0350aae558445239131a82974e06396d94 100644 --- a/build/env.yml +++ b/build/env.yml @@ -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 diff --git a/chapter_appendix/aws.md b/chapter_appendix/aws.md index c845261698e32784aeac6a819da9efb873f1a41d..7a16825c0908cb50677c704334b9041b91872232 100644 --- a/chapter_appendix/aws.md +++ b/chapter_appendix/aws.md @@ -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记事本 diff --git a/chapter_computer-vision/image-augmentation.md b/chapter_computer-vision/image-augmentation.md index 6211a2f8445b6f9624c904a11996ed03dba7a6d3..1d0266d16d1a33f57618f0543b53f8cb274371c8 100644 --- a/chapter_computer-vision/image-augmentation.md +++ b/chapter_computer-vision/image-augmentation.md @@ -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) ``` ### 有关图像增广的对比实验 diff --git a/chapter_computer-vision/ssd.md b/chapter_computer-vision/ssd.md index f4cc765a27138bf9551dc2d6c85d9224e9ddd9e9..31fb9f6083ac08397eaba9d967a1135cec242678 100644 --- a/chapter_computer-vision/ssd.md +++ b/chapter_computer-vision/ssd.md @@ -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。定义好模型以后,我们需要初始化模型参数并定义优化算法。 diff --git a/chapter_deep-learning-computation/read-write.md b/chapter_deep-learning-computation/read-write.md index 79e696f5efd6f9177f8400c2778de3d065a9a667..07b1af0701aa5acfc8008e78947424261409aca7 100644 --- a/chapter_deep-learning-computation/read-write.md +++ b/chapter_deep-learning-computation/read-write.md @@ -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`的计算结果将会是一样。我们来验证一下。 diff --git a/chapter_introduction/how-to-use.md b/chapter_introduction/how-to-use.md index 369c331000bca81f101ba5bb64f379071afba146..985d8da46e09c1ec690cebe50a2e5f586acc1f96 100644 --- a/chapter_introduction/how-to-use.md +++ b/chapter_introduction/how-to-use.md @@ -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`等模块的基础功能,使你尽可能了解深度学习算法的实现细节。即便你在研究和工作中使用了其他深度学习框架,书中的代码也能帮助你更好地理解深度学习算法。 diff --git a/chapter_natural-language-processing/similarity-analogy.md b/chapter_natural-language-processing/similarity-analogy.md index 7f870020848d6cd96d0cdb3786db144d0f043176..7dfa1f0f0513680fdcc07c62653c29724f44cfbb 100644 --- a/chapter_natural-language-processing/similarity-analogy.md +++ b/chapter_natural-language-processing/similarity-analogy.md @@ -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]] ``` 验证下“男-女”类比。 diff --git a/chapter_natural-language-processing/word2vec-gluon.md b/chapter_natural-language-processing/word2vec-gluon.md index 602e58080fb815458fb4de5e53345ab268cb8276..24ab943099028d3a19a5d341ece91443f1de4a02 100644 --- a/chapter_natural-language-processing/word2vec-gluon.md +++ b/chapter_natural-language-processing/word2vec-gluon.md @@ -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`实例中小批量的读取方式,并打印了读取的第一个批量中各个变量的形状。这些形状该如何计算得到? * 试着找出其他词的近义词。 * 调一调超参数,观察并分析实验结果。 diff --git a/chapter_prerequisite/install.md b/chapter_prerequisite/install.md index 73a88d3d90a0b5218cec0600c944d580af50db47..e131dc7664c7b4a097193b6616c5cb3f11710421 100644 --- a/chapter_prerequisite/install.md +++ b/chapter_prerequisite/install.md @@ -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 diff --git a/environment.yml b/environment.yml index 5e08acfec77e8e41568ec77259d83ba580a4ae76..a3ef8c8851af67d22fd401294d708f4dd9e5304f 100644 --- a/environment.yml +++ b/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