8.6 循环神经网络简洁实现

循环神经网络高级API实现

虽然8.5描述内容了解循环神经网络实现方式具有指导意义但并不方便展示如何使用深度学习框架高级API提供函数有效的使用相同预言模型我们仍然读取时光机器数据集开始

import torch

from torch import nn

from torch.nn import functional as F

from d2l import torch as d2l

batch_size, num_steps = 32, 33

train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)

8.6.1 定义模型

高级API提供了循环神经网络实现构建一个具有256隐藏单元隐藏循环神经网络rnn_layer实际上我们还没有讨论多层循环神经网络意义仅仅需要多层理解一层循环神经网络输出用作下一层循环神经网络输入就足够了

num_hiddens = 256

rnn_layer = nn.RNN(vocab, num_hiddens)

我们使用张量初始化状态他的形状隐藏层数批量大小隐藏单元

state = torch.zeros((l, batch_size, num_hiddens))

state.shape

torch.Size([1, 32, 256])

通过一个状态一个输入我们就可以更新后状态计算输出需要强调的是rnn_layer输出 不涉及输出计算它是指每个时间状态这些状态可以用作后续输出输入

X = torch.rand(size=(num_steps, batch_size, len(vocab)))

Y, state_new = rnn_layer(X, state)

  1. shape, state_new.shape

(torch.Size([35, 32, 256])), torch.Size([1, 32, 256])

我们为一个完整循环神经网络模型定义一个RNNModel注意rnn_layer 包含隐藏循环层还需要创建一个单独输出层

class RNNModel(nn.Module)

#循环神经网络模型

def __init__(self, rnn_layer, vocab_size, **kwargs):

super(RNNModel, self).__init__(**kwargs)

self.rnn = rnn_layer

self.vocab_size = vocab_size

self.num_hiddens = self.rnn_hidden_size

#如果RNN双向num_directions应该2否则应该是1

if not self.rnn.hidirectioanl:

self.num_directions = 1

self.linear = nn.Linear(self.num_hiddens, self.vocab_size)

else:

slef.num_directions = 2

self.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形状(时间步数 不等于批量大小,隐单元数)

#输出形状(时间步数x批量大小,词表大小)

output = self.linear(Y.reshape((-1, Y.shape[-1])))

return output, state

def begin_state(self, device, batch_size=1):

if not isinstance(self.rnn, nn.LSTM):

#nn.GRU张量作为状态

return torch.zeros(self.num_directions * self.rnn.num_layers, batch_szie, self.num_hiddens), device = device

size:

#nn.LSTM元组作为状态

return (torch.zeros((self.num_directions self.rnn.num_layers, batch_size, self.num_hiddens), device=device), torch.zeros((self.num_directions self.rnn.num_layers, batch_size, self.num_hiddens), device=device))

8.6.2 训练预测

在训练之前我们基于一个具有随机权重模型进行预测

device = d2l.try_gpu()

net = RNNModel(rnn_layer, vocab_size=len(vocab))

net = net.to(device)

d2l.predict_ch8('time travller', 18, net, vocab, device)

很明显, 这种模型根本不能输出理想结果接下来我们使用8.5定义超参数调用train_ch8函数并且使用高级API训练模型

num_epochs, lr = 500, 1

d2l.train_ch8(net, train_iter, vocab, lr, num_epochs, device)

8.5相比深度学习框架高级API代码进行了更多优化该模型较短时间达到较低困惑度

小结

深度学习框架高级API提供了循环神经网络实现

高级API循环神经网络返回一个输出一个更新后状态我们还需要计算整个模型输出层

从零开始实现循环神经网络相比使用高级API实现可以加速训练

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值