【问题标题】:Bidirectional RNN Implementation pytorch双向RNN实现pytorch
【发布时间】:2020-07-27 19:10:51
【问题描述】:

您好,我想了解双向 RNN。

> class RNN(nn.Module):
> 

> 
>   def __init__(self,n_vocab,n_embed,hidden_size,output_size):
> 
>     super().__init__()
> 
>     self.hidden_size = hidden_size
> 
>     self.embedding = nn.Embedding(n_vocab+1,n_embed) ## n_vocab is unique words in dictionary ## n_embed is hyperparameter

>     self.rnn = nn.RNN(n_embed, hidden_size, num_layers = 1, batch_first = True,bidirectional = True) # 
> 
>     self.fc =  nn.Linear(hidden_size,output_size)   
> 
>   def forward(self,x):>
> 
>     x = x # input batch_size * seq_length
> 
>     batch_size = x.size(0) 
> 
>     #print('Batch Size is',batch_size)
> 
>     x = self.embedding(x) # batch-size x seq_length x embedding_dimension
> 
>     x,hidden =self.rnn(x)   #batch-size x seq_length x hidden_size
> 
> 
> 
>     return x,hidden

我在浏览教程时同时返回隐藏状态和输出,有人说我需要连接隐藏状态 (torch.cat((hidden[-2,:,:], hidden[-1,:,:]) , dim = 1)) 并且在某些教程中采用输出状态 (x[:,-1,:]) 但两种结果都不同。

做双向RNN的正确方法是什么。

【问题讨论】:

    标签: nlp pytorch recurrent-neural-network


    【解决方案1】:

    两种方式都是正确的,取决于不同的条件。如果nn.RNN 是双向的(就像您的情况一样),您将需要连接隐藏状态的输出。如果nn.RNN 是双向的,它将输出形状的隐藏状态:(num_layers * num_directions, batch, hidden_size)。在神经网络的上下文中,当 RNN 是双向的时,我们需要连接来自两侧(LTR 和 RTL)的隐藏状态。这就是为什么您需要使用torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim = 1) 连接隐藏状态,这与x[:,-1,:]) 基本相同。

    【讨论】:

      猜你喜欢
      • 2018-12-24
      • 2021-09-15
      • 1970-01-01
      • 2019-06-16
      • 2018-08-10
      • 1970-01-01
      • 2023-03-29
      • 2021-11-16
      • 1970-01-01
      相关资源
      最近更新 更多