使用pad_sequence时如何管理隐藏状态变暗?

问题描述 投票:0回答:1

使用Pytorch LSTM架构尝试构建文本生成模型。对于每个批次,我都使用pad_sequence对每个序列进行最小填充,因此我有一个可变的dims批次(batch_size * seq_len)。我也将pack_padded_seq应用于仅将非零(非填充)令牌提供给LSTM。但是,变量dims批处理在按以下方式将其输入LSTM时会引发错误; 预期隐藏[0]大小(1、8、16),得到(1、16、16)。在此错误中,我为每个序列的批次大小16提供了8个令牌,但隐藏状态为16 * 16。

我试图在forward函数中创建隐藏状态,但是效果不佳。如何创建隐藏状态,使其可以接受可变的dims批处理,并且不会因整个epoche丢失?

class RNNModule(nn.Module):
    def __init__(self, n_vocab, seq_size, embedding_size, lstm_size):
        super(RNNModule, self).__init__()
        self.seq_size = seq_size
        self.lstm_size = lstm_size
        self.embedding, num_embeddings, embedding_dim = create_emb_layer(weight_matrix, False)        
        self.lstm = nn.LSTM(embedding_size,
                        lstm_size,
                        num_layers=flags.n_layers,
                        batch_first=True
                        )
        self.dense = nn.Linear(lstm_size, n_vocab)

    def forward(self, x,length,prev_state):

        embed = self.embedding(x)
        packed_input = db.pack_src(embed,length)
        packed_output, state = self.lstm(packed_input,prev_state)
        padded,_ = db.pad_pack(packed_output) 
        logits = self.dense(padded)
        return logits, state


    def zero_state(self, batch_size = flags.batch_size):
        return (torch.zeros(flags.n_layers, batch_size, self.lstm_size),
            torch.zeros(flags.n_layers, batch_size, self.lstm_size))


input: tensor([[  19,    9,    4,    3,   68,    8,    6,    2],
    [  19,    9,    4,    3,    7,    8,    6,    2],
    [   3,   12,   17,   10,    6,   40,    2,    0],
    [   4,    3,  109,    7,    6,    2,    0,    0],
    [ 188,    6,    7,   18,    3,    2,    0,    0],
    [   4,    3,   12,    6,    7,    2,    0,    0],
    [   6,    7,    3,   13,    2,    0,    0,    0],
    [   3,   28,   17,   69,    2,    0,    0,    0],
    [   6,    3,   12,   11,    2,    0,    0,    0],
    [   3,   13,    6,    7,    2,    0,    0,    0],
    [   3,    6,    7,   13,    2,    0,    0,    0],
    [   6,    3,   23,    7,    2,    0,    0,    0],
    [   3,   28,   10,    2,    0,    0,    0,    0],
    [   6,    3,   23,    2,    0,    0,    0,    0],
    [   3,    6,   37,    2,    0,    0,    0,    0],
    [1218,    2,    0,    0,    0,    0,    0,    0]])

零令牌正在填充。嵌入尺寸:64LSTM大小:16批次大小:16

使用Pytorch LSTM架构尝试构建文本生成模型。对于每个批次,我都使用pad_sequence对每个序列进行最小填充,因此我有可变的dims批次(...

neural-network pytorch lstm padding recurrent-neural-network
1个回答
0
投票

您创建的隐藏状态的大小具有正确的大小,但您的输入没有。用nn.utils.rnn.pack_padded_sequence打包时,您已经设置了nn.utils.rnn.pack_padded_sequence,但是当您将数据传递到打包时,数据的大小为[[batch_size,seq_len,embedding_size]] >>,因此,batch_size作为第一维。同样对于LSTM,使用batch_first=False,它适合您的数据。

© www.soinside.com 2019 - 2024. All rights reserved.