6
6
7
7
``` {.python .input n=1}
8
8
import collections
9
+ import gluonbook as gb
9
10
import math
10
11
from mxnet import autograd, gluon, nd
11
12
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),
285
286
286
287
``` {.python .input n=23}
287
288
def train(net, lr, num_epochs):
288
- net.initialize(force_reinit=True)
289
+ ctx = gb.try_gpu()
290
+ net.initialize(ctx=ctx, force_reinit=True)
289
291
trainer = gluon.Trainer(net.collect_params(), 'adam',
290
292
{'learning_rate': lr})
291
293
for epoch in range(num_epochs):
292
294
start_time, train_l_sum = time.time(), 0
293
295
for batch in data_iter:
294
- center, context_negative, mask, label = batch
296
+ center, context_negative, mask, label = [
297
+ data.as_in_context(ctx) for data in batch]
295
298
with autograd.record():
296
299
pred = skip_gram(center, context_negative, net[0], net[1])
297
300
# 使用掩码变量 mask 来避免填充项对损失函数计算的影响。
@@ -319,7 +322,8 @@ train(net, 0.005, 3)
319
322
def get_similar_tokens(query_token, k, embed):
320
323
W = embed.weight.data()
321
324
x = W[token_to_idx[query_token]]
322
- cos = nd.dot(W, x) / nd.sum(W * W, axis=1).sqrt() / nd.sum(x * x).sqrt()
325
+ # # 添加的 1e-9 是为了数值稳定性。
326
+ cos = nd.dot(W, x) / (nd.sum(W * W, axis=1) * nd.sum(x * x) + 1e-9).sqrt()
323
327
topk = nd.topk(cos, k=k+1, ret_typ='indices').asnumpy().astype('int32')
324
328
for i in topk[1:]: # 除去输入词。
325
329
print('cosine sim=%.3f: %s' % (cos[i].asscalar(), (idx_to_token[i])))
@@ -336,6 +340,7 @@ get_similar_tokens('chip', 3, net[0])
336
340
337
341
## 练习
338
342
343
+ * 在创建` nn.Embedding ` 实例时设参数` sparse_grad=True ` ,训练是否可以加速?查阅MXNet文档,了解该参数的意义。
339
344
* 我们用` batchify ` 函数指定` DataLoader ` 实例中小批量的读取方式,并打印了读取的第一个批量中各个变量的形状。这些形状该如何计算得到?
340
345
* 试着找出其他词的近义词。
341
346
* 调一调超参数,观察并分析实验结果。
0 commit comments