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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容