感谢伯禹学习平台,本次学习将记录记录如何使用Pytorch高效实现网络,熟练掌握Pytorch的基础知识,记录不包含理论知识的细节展开
一:GRU和LSTM-Pytorch实现
GRU结构,来自教学平台的图片 GRU结构示意图LSTM结构,来自教学平台的图片 LSTM结构示意图
二者的具体实现如下
# 导入Pytorch
import torch
import torch.nn as nn
# 定义GRU层,vocab_size表示你词向量的维度,简而言之是有多少不同的单词,hidden_size表示隐藏层大小
gru_layer = nn.GRU(input_size=vocab_size, hidden_size=num_hiddens)
# 定义LSTM层
lstm_layer = nn.LSTM(input_size=vocab_size, hidden_size=num_hiddens)
# 多层的RNN可以通过num_layers指定层数
gru_layer = nn.LSTM(input_size=vocab_size, hidden_size=num_hiddens,num_layers=6)
# 双向则可以通过bidirectional这个参数指定
gru_layer = nn.GRU(input_size=vocab_size, hidden_size=num_hiddens,bidirectional=True)
# 可以指定输出的顺序默认为
gru_layer = nn.GRU(input_size=vocab_size, hidden_size=num_hiddens,batch_first=True)
# 查看学习github的源码可以找到如下定义,也可以自定义封装
class RNNModel(nn.Module):
def __init__(self, rnn_layer, vocab_size):
super(RNNModel, self).__init__()
self.rnn = rnn_layer
# 如果是双向的则隐藏层数目加一倍就可以了
self.hidden_size = rnn_layer.hidden_size * (2 if rnn_layer.bidirectional else 1)
self.vocab_size = vocab_size
#输出层的样子
self.dense = nn.Linear(self.hidden_size, vocab_size)
self.state = None
def forward(self, inputs, state): # inputs: (batch, seq_len)
# 获取one-hot向量表示,inputs表示的输入词的index
X = to_onehot(inputs, self.vocab_size) # X是个list
# RNN传播,默认输出Y为(num_steps ,batch_size, num_hiddens)
Y, self.state = self.rnn(torch.stack(X), state)
# 全连接层会首先将Y的形状变成(num_steps * batch_size, num_hiddens)
# 形状为(num_steps * batch_size, vocab_size)
output = self.dense(Y.view(-1, Y.shape[-1]))
return output, self.state
网友评论