STEP-2:RNN:GRU、LSTM-Pytorch

感谢伯禹学习平台,本次学习将记录记录如何使用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

你可能感兴趣的:(STEP-2:RNN:GRU、LSTM-Pytorch)