Pytorch LSTM - 逐字生成句子?
Pytorch LSTM - generating sentence- word by word?
我正在尝试实现一个神经网络来生成句子(图像说明),为此我正在使用 Pytorch 的 LSTM (nn.LSTM
)。
我想在训练中输入的输入来自大小 batch_size * seq_size * embedding_size
,因此 seq_size
是一个句子的最大大小。例如 - 64*30*512
.
在 LSTM 之后有一个 FC 层 (nn.Linear
)。
据我了解,这种类型的网络使用隐藏状态(h,c
在这种情况下),并且每次都预测下一个词。
我的问题是 - 在训练中 - 我们是否必须在 forward
函数中手动将句子逐字输入到 LSTM,或者 LSTM 知道如何自己做?
我的前向函数是这样的:
def forward(self, features, caption, h = None, c = None):
batch_size = caption.size(0)
caption_size = caption.size(1)
no_hc = False
if h == None and c == None:
no_hc = True
h,c = self.init_hidden(batch_size)
embeddings = self.embedding(caption)
output = torch.empty((batch_size, caption_size, self.vocab_size)).to(device)
for i in range(caption_size): #go over the words in the sentence
if i==0:
lstm_input = features.unsqueeze(1)
else:
lstm_input = embeddings[:,i-1,:].unsqueeze(1)
out, (h,c) = self.lstm(lstm_input, (h,c))
out = self.fc(out)
output[:,i,:] = out.squeeze()
if no_hc:
return output
return output, h,c
(灵感来自 here)
这里forward
的输出来自大小batch_size * seq_size * vocab_size
,这很好,因为它可以在损失函数中与原始batch_size * seq_size
大小的标题进行比较。
问题是 forward
中的这个 for
循环是否真的有必要一个接一个地输入单词,或者我可以以某种方式一次输入整个句子并获得相同的结果?
(我看到了一些这样做的例子,例如 this one,但我不确定它是否真的等价)
答案是,LSTM 自己知道怎么做。您不必一个一个地手动输入每个单词。
一种直观的理解方式是,您发送的批次的形状包含 seq_length
(batch.shape[1]
),它使用它来决定句子中的单词数。单词通过 LSTM Cell
生成隐藏状态和 C.
我正在尝试实现一个神经网络来生成句子(图像说明),为此我正在使用 Pytorch 的 LSTM (nn.LSTM
)。
我想在训练中输入的输入来自大小 batch_size * seq_size * embedding_size
,因此 seq_size
是一个句子的最大大小。例如 - 64*30*512
.
在 LSTM 之后有一个 FC 层 (nn.Linear
)。
据我了解,这种类型的网络使用隐藏状态(h,c
在这种情况下),并且每次都预测下一个词。
我的问题是 - 在训练中 - 我们是否必须在 forward
函数中手动将句子逐字输入到 LSTM,或者 LSTM 知道如何自己做?
我的前向函数是这样的:
def forward(self, features, caption, h = None, c = None):
batch_size = caption.size(0)
caption_size = caption.size(1)
no_hc = False
if h == None and c == None:
no_hc = True
h,c = self.init_hidden(batch_size)
embeddings = self.embedding(caption)
output = torch.empty((batch_size, caption_size, self.vocab_size)).to(device)
for i in range(caption_size): #go over the words in the sentence
if i==0:
lstm_input = features.unsqueeze(1)
else:
lstm_input = embeddings[:,i-1,:].unsqueeze(1)
out, (h,c) = self.lstm(lstm_input, (h,c))
out = self.fc(out)
output[:,i,:] = out.squeeze()
if no_hc:
return output
return output, h,c
(灵感来自 here)
这里forward
的输出来自大小batch_size * seq_size * vocab_size
,这很好,因为它可以在损失函数中与原始batch_size * seq_size
大小的标题进行比较。
问题是 forward
中的这个 for
循环是否真的有必要一个接一个地输入单词,或者我可以以某种方式一次输入整个句子并获得相同的结果?
(我看到了一些这样做的例子,例如 this one,但我不确定它是否真的等价)
答案是,LSTM 自己知道怎么做。您不必一个一个地手动输入每个单词。
一种直观的理解方式是,您发送的批次的形状包含 seq_length
(batch.shape[1]
),它使用它来决定句子中的单词数。单词通过 LSTM Cell
生成隐藏状态和 C.