pytorch 中的 keras.layers.Masking 相当于什么?

Mos*_*ahi 6 deep-learning keras pytorch

我有时间序列序列,我需要通过将零填充到矩阵中并在 keras 中使用 keras.layers.Masking 来将序列的长度固定为一个数字,我可以忽略这些填充的零以进行进一步的计算,我想知道它怎么可能在 Pytorch 中完成?

要么我需要在 pytroch 中进行填充,而 pytorch 无法处理不同长度的序列,这相当于 pytorch 中 keras 的屏蔽层,或者如果 pytorch 处理不同长度的序列,怎么办?

Dis*_*ani 1

您可以使用PackedSequence类等同于 keras masking。您可以在以下位置找到更多功能torch.nn.utils.rnn

这里给出了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]

Run Code Online (Sandbox Code Playgroud)

更多你会发现这篇文章很有用。[跳转到标题 - “PackedSequence 对象如何工作”] -链接