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.