在 pytorch LSTM 上循环
Looping over pytorch LSTM
我正在 pytorch 中训练用于机器翻译的 seq2seq 模型。我想在每个时间步收集细胞状态,同时仍然具有多层和双向性的灵活性,例如,您可以在 pytorch 的 LSTM 模块中找到。
为此,我有以下编码器和前向方法,我在其中循环遍历 LSTM 模块。问题是,模型训练得不是很好。循环终止后,您可以看到使用 LSTM 模块的正常方式,并以此来训练模型。
那么,循环不是执行此操作的有效方法吗?
class encoder(nn.Module):
def __init__(self, input_dim, emb_dim, hid_dim, n_layers, dropout):
super().__init__()
self.input_dim = input_dim
self.emb_dim = emb_dim
self.hid_dim = hid_dim
self.n_layers = n_layers
self.dropout = dropout
self.embedding = nn.Embedding(input_dim, emb_dim)
self.rnn = nn.LSTM(emb_dim, hid_dim, n_layers, dropout = dropout)
self.dropout = nn.Dropout(dropout)
def forward(self, src):
#src = [src sent len, batch size]
embedded = self.dropout(self.embedding(src))
#embedded = [src sent len, batch size, emb dim]
hidden_all = []
for i in range(len(embedded[:,1,1])):
outputs, hidden = self.rnn(embedded[i,:,:].unsqueeze(0))
hidden_all.append(hidden)
#outputs, hidden = self.rnn(embedded)
#outputs = [src sent len, batch size, hid dim * n directions]
#hidden = [n layers * n directions, batch size, hid dim]
#cell = [n layers * n directions, batch size, hid dim]
None
#outputs are always from the top hidden layer
return hidden
好的,所以修复非常简单,你可以 运行 外面的第一个时间步,得到一个隐藏的元组输入到 LSTM 模块中。
我正在 pytorch 中训练用于机器翻译的 seq2seq 模型。我想在每个时间步收集细胞状态,同时仍然具有多层和双向性的灵活性,例如,您可以在 pytorch 的 LSTM 模块中找到。
为此,我有以下编码器和前向方法,我在其中循环遍历 LSTM 模块。问题是,模型训练得不是很好。循环终止后,您可以看到使用 LSTM 模块的正常方式,并以此来训练模型。
那么,循环不是执行此操作的有效方法吗?
class encoder(nn.Module):
def __init__(self, input_dim, emb_dim, hid_dim, n_layers, dropout):
super().__init__()
self.input_dim = input_dim
self.emb_dim = emb_dim
self.hid_dim = hid_dim
self.n_layers = n_layers
self.dropout = dropout
self.embedding = nn.Embedding(input_dim, emb_dim)
self.rnn = nn.LSTM(emb_dim, hid_dim, n_layers, dropout = dropout)
self.dropout = nn.Dropout(dropout)
def forward(self, src):
#src = [src sent len, batch size]
embedded = self.dropout(self.embedding(src))
#embedded = [src sent len, batch size, emb dim]
hidden_all = []
for i in range(len(embedded[:,1,1])):
outputs, hidden = self.rnn(embedded[i,:,:].unsqueeze(0))
hidden_all.append(hidden)
#outputs, hidden = self.rnn(embedded)
#outputs = [src sent len, batch size, hid dim * n directions]
#hidden = [n layers * n directions, batch size, hid dim]
#cell = [n layers * n directions, batch size, hid dim]
None
#outputs are always from the top hidden layer
return hidden
好的,所以修复非常简单,你可以 运行 外面的第一个时间步,得到一个隐藏的元组输入到 LSTM 模块中。