我有时间序列,我需要通过将零填充到矩阵中并在keras中使用keras.layers.Masking来保持序列长度固定到一个数字,我可以忽略这些填充的零进行进一步的计算,我想知道如何在Pytorch中做到这一点?
要么我需要在pytroch和pytorch中做填充,而pytorch不能处理可变长度的序列,这相当于pytorch中keras的掩蔽层,或者如果pytorch处理不同长度的序列,怎么做呢?
发布于 2019-12-31 23:52:40
您可以使用PackedSequence类作为keras掩蔽的等价物。您可以在torch.nn.utils.rnn
上找到更多功能
下面是来自packing for variable-length sequence inputs for rnn的示例
import torch
import torch.nn as nn
from torch.autograd import Variable
batch_size = 3
max_length = 3
hidden_size = 2
n_layers =1
# container
batch_in = torch.zeros((batch_size, 1, max_length))
#data
vec_1 = torch.FloatTensor([[1, 2, 3]])
vec_2 = torch.FloatTensor([[1, 2, 0]])
vec_3 = torch.FloatTensor([[1, 0, 0]])
batch_in[0] = vec_1
batch_in[1] = vec_2
batch_in[2] = vec_3
batch_in = Variable(batch_in)
seq_lengths = [3,2,1] # list of integers holding information about the batch size at each sequence step
# pack it
pack = torch.nn.utils.rnn.pack_padded_sequence(batch_in, seq_lengths, batch_first=True)
>>> pack
PackedSequence(data=Variable containing:
1 2 3
1 2 0
1 0 0
[torch.FloatTensor of size 3x3]
, batch_sizes=[3])
# initialize
rnn = nn.RNN(max_length, hidden_size, n_layers, batch_first=True)
h0 = Variable(torch.randn(n_layers, batch_size, hidden_size))
#forward
out, _ = rnn(pack, h0)
# unpack
unpacked, unpacked_len = torch.nn.utils.rnn.pad_packed_sequence(out)
>>> unpacked
Variable containing:
(0 ,.,.) =
-0.7883 -0.7972
0.3367 -0.6102
0.1502 -0.4654
[torch.FloatTensor of size 1x3x2]
更多的你会发现这篇文章很有用。Jum to Title -“PackedSequence对象如何工作”- link
https://stackoverflow.com/questions/59545229
复制相似问题