公司网站 自己是空间服务商 cms,新工商名录,如何自做网站,谷歌网页注#xff1a;书中对代码的讲解并不详细#xff0c;本文对很多细节做了详细注释。另外#xff0c;书上的源代码是在Jupyter Notebook上运行的#xff0c;较为分散#xff0c;本文将代码集中起来#xff0c;并加以完善#xff0c;全部用vscode在python 3.9.18下测试通过书中对代码的讲解并不详细本文对很多细节做了详细注释。另外书上的源代码是在Jupyter Notebook上运行的较为分散本文将代码集中起来并加以完善全部用vscode在python 3.9.18下测试通过同时对于书上部分章节也做了整合。
Chapter8 Recurrent Neural Networks
8.6 Concise Implementation of RNN
import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l
import matplotlib.pyplot as pltbatch_size, num_steps 32, 35
train_iter, vocab d2l.load_data_time_machine(batch_size, num_steps)num_hiddens 256
rnn_layer nn.RNN(len(vocab), num_hiddens)state torch.zeros((1, batch_size, num_hiddens))
print(state.shape)X torch.rand(size(num_steps, batch_size, len(vocab)))
Y, state_new rnn_layer(X, state)#Y不涉及输出层的计算
print(Y.shape, state_new.shape)class RNNModel(nn.Module):#save循环神经网络模型def __init__(self, rnn_layer, vocab_size, **kwargs):super(RNNModel, self).__init__(**kwargs)self.rnn rnn_layerself.vocab_size vocab_sizeself.num_hiddens self.rnn.hidden_size# 如果RNN是双向的之后将介绍num_directions应该是2否则应该是1if not self.rnn.bidirectional:self.num_directions 1self.linear nn.Linear(self.num_hiddens, self.vocab_size)else:self.num_directions 2self.linear nn.Linear(self.num_hiddens * 2, self.vocab_size)def forward(self, inputs, state):X F.one_hot(inputs.T.long(), self.vocab_size)X X.to(torch.float32)Y, state self.rnn(X, state)# 全连接层首先将Y的形状改为(时间步数*批量大小,隐藏单元数)它的输出形状是(时间步数*批量大小,词表大小)。output self.linear(Y.reshape((-1, Y.shape[-1])))return output, statedef begin_state(self, device, batch_size1):if not isinstance(self.rnn, nn.LSTM):#nn.GRU以张量作为隐状态#GRU为门控循环单元(Gated Recurrent Unit)是一种流行的循环神经网络变体。#GRU使用了一组门控机制来控制信息的流动包括更新门(update gate)和重置门(reset gate)以更好地捕捉长期依赖关系return torch.zeros((self.num_directions * self.rnn.num_layers,batch_size, self.num_hiddens),devicedevice)else:#nn.LSTM以元组作为隐状态#LSTM代表长短期记忆网络(Long Short-Term Memory)是另一种常用的循环神经网络类型。#相比于简单的循环神经网络LSTM引入了三个门控单元输入门(input gate)、遗忘门(forget gate)和输出门(output gate)以及一个记忆单元(cell state)可以更有效地处理长期依赖性。return (torch.zeros((self.num_directions * self.rnn.num_layers,batch_size, self.num_hiddens), devicedevice),torch.zeros((self.num_directions * self.rnn.num_layers,batch_size, self.num_hiddens), devicedevice))device d2l.try_gpu()
net RNNModel(rnn_layer, vocab_sizelen(vocab))
net net.to(device)
d2l.predict_ch8(time traveller, 10, net, vocab, device)num_epochs, lr 500, 1
d2l.train_ch8(net, train_iter, vocab, lr, num_epochs, device)
plt.show()训练结果:
与上一节相比由于pytorch的高级API对代码进行了更多的优化该模型在较短的时间内达到了较低的困惑度。