双向 RNN 实现 pytorch
Bidirectional RNN Implementation pytorch
您好,我正在尝试了解双向 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 的正确方法是什么。
两种方式都对,要看不同的情况。如果 nn.RNN
是双向的(如您的情况),您将需要连接隐藏状态的输出。如果 nn.RNN
是双向的,它将输出形状的隐藏状态:(num_layers * num_directions, batch, hidden_size)
。在神经网络的上下文中,当 RNN 是双向的时,我们需要连接两侧(LTR 和 RTL)的隐藏状态。这就是为什么您需要使用 torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim = 1)
连接隐藏状态的原因,这与 x[:,-1,:])
.
基本相同
torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim = 1)
将连接 2 个 GRU(向后和向前)的最后隐藏状态。
而 x[:,-1,:]
是前向 GRU 的最后一个隐藏状态与第二个 GRU 的第一个隐藏状态的串联。换句话说,它只关注最后一个时间步。
所以在你的情况下,你可能会选择第一个选项。
您好,我正在尝试了解双向 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 的正确方法是什么。
两种方式都对,要看不同的情况。如果 nn.RNN
是双向的(如您的情况),您将需要连接隐藏状态的输出。如果 nn.RNN
是双向的,它将输出形状的隐藏状态:(num_layers * num_directions, batch, hidden_size)
。在神经网络的上下文中,当 RNN 是双向的时,我们需要连接两侧(LTR 和 RTL)的隐藏状态。这就是为什么您需要使用 torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim = 1)
连接隐藏状态的原因,这与 x[:,-1,:])
.
torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim = 1)
将连接 2 个 GRU(向后和向前)的最后隐藏状态。
而 x[:,-1,:]
是前向 GRU 的最后一个隐藏状态与第二个 GRU 的第一个隐藏状态的串联。换句话说,它只关注最后一个时间步。
所以在你的情况下,你可能会选择第一个选项。