6 循环神经网络的简洁实现
1 | import torch |
6.1 定义模型
- 我们构造一个具有256个隐藏单元的单隐藏层的循环神经网络层rnn_layer。
1 | num_hiddens = 256 |
- 使用张量来初始化隐状态,它的形状是(隐藏层数,批量大小,隐藏单元数)。
1 | state = torch.zeros((1, batch_size, num_hiddens)) |
torch.Size([1, 32, 256])
- 通过一个隐状态和一个输入,我们就可以用更新后的隐状态计算输出。rnn_layer的“输出”(Y)不涉及输出层的计算:它是指每个时间步的隐状态,这些隐状态可以用作后续输出层的输入。
1 | X = torch.rand(size=(num_steps, batch_size, len(vocab))) |
(torch.Size([35, 32, 256]), torch.Size([1, 32, 256]))
- 为一个完整的循环神经网络模型定义了一个RNNModel类。注意,rnn_layer只包含隐藏的循环层,我们还需要创建一个单独的输出层。
1 | #@save |
6.2 训练与预测
1 | device = d2l.try_gpu() |
'time travelleruttwwputtw'
- 效果不好,训练:
1 | import os |
perplexity 1.3, 93581.6 tokens/sec on cpu
time travellerit would be relarkably oole pare whe grove to trov
traveller after the pars of ate that ink of the incand sce
- 与上一节相比,由于深度学习框架的高级API对代码进行了更多的优化,该模型在较短的时间内达到了较低的困惑度。