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