美文网首页
STEP-2:RNN:GRU、LSTM-Pytorch

STEP-2:RNN:GRU、LSTM-Pytorch

作者: 可恶小林子 | 来源:发表于2020-02-14 19:57 被阅读0次
    感谢伯禹学习平台,本次学习将记录记录如何使用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

          本文链接:https://www.haomeiwen.com/subject/boujfhtx.html