3

我有这个解码器模型,它应该将成批的句子嵌入(batchsize = 50,hidden size=300)作为输入,并输出一批预测句子的热表示:

class DecoderLSTMwithBatchSupport(nn.Module):
        # Your code goes here
        def __init__(self, embedding_size,batch_size, hidden_size, output_size):
            super(DecoderLSTMwithBatchSupport, self).__init__()
            self.hidden_size = hidden_size
            self.batch_size = batch_size
            self.lstm = nn.LSTM(input_size=embedding_size,num_layers=1, hidden_size=hidden_size, batch_first=True)
            self.out = nn.Linear(hidden_size, output_size)
            self.softmax = nn.LogSoftmax(dim=1)

        def forward(self, my_input, hidden):
            print(type(my_input), type(hidden))
            output, hidden = self.lstm(my_input, hidden)
            output = self.softmax(self.out(output[0]))
            return output, hidden

        def initHidden(self):
            return Variable(torch.zeros(1, self.batch_size, self.hidden_size)).cuda()

但是,当我使用以下命令运行它时:

decoder=DecoderLSTMwithBatchSupport(vocabularySize,batch_size, 300, vocabularySize)
decoder.cuda()
decoder_input=np.zeros([batch_size,vocabularySize])
    for i in range(batch_size):
        decoder_input[i] = embeddings[SOS_token]
    decoder_input=Variable(torch.from_numpy(decoder_input)).cuda()
    decoder_hidden = (decoder.initHidden(),decoder.initHidden())
        for di in range(target_length):
            decoder_output, decoder_hidden = decoder(decoder_input.view(1,batch_size,-1), decoder_hidden)

我得到他以下错误:

预期 hidden[0] 大小 (1, 1, 300),得到 (1, 50, 300)

为了使模型期望成批的隐藏状态,我缺少什么?

4

2 回答 2

1

创建 时,不需要LSTM该标志,因为它采用不同的输入形状。batch_first从文档:

如果为 True,则输入和输出张量作为 (batch, seq, feature) 提供。默认值:假

将 LSTM 创建更改为:

self.lstm = nn.LSTM(input_size=embedding_size, num_layers=1, hidden_size=hidden_size)

此外,还有类型错误。当您创建decoder_inputusingtorch.from_numpy()时,它有一个dtype=torch.float64,而decoder_input默认为dtype=torch.float32。将您创建的行更改为decoder_input类似

decoder_input = Variable(torch.from_numpy(decoder_input)).cuda().float()

通过这两种更改,它应该可以正常工作:)

于 2019-02-07T14:02:55.200 回答
0

更改 .view() 以反映 [1,batch size, embedding_size] 作为第一维。

此外,您不需要初始化零张量,如果没有提供张量作为初始张量,pytorch 使用零张量。

于 2019-02-07T20:00:47.427 回答