首页 > 解决方案 > 给定长度列表,重塑和填充张量

问题描述

我给出了一个in形状a x b如下的二维张量(其中, , ...中的a = 9每一个都代表一个维向量):A1A2C2b

在

此外,我有一个数组lengths,其中sum(lengths) = a每个条目都是一个正整数:

长度

然后我想获得一个 3d 输出张量out,其中第一个lengths[0]条目in形成第一行,下一个lengths[1]条目in形成第二行,依此类推。也就是说,输出张量的形状应该是len(lengths) x max(lengths) x b,并用零填充(0下图中的每个表示一个一b维零向量):

出去

由于这是使用反向传播训练的神经网络的一部分,因此使用的所有操作都必须是可微的。如何使用 PyTorch实现这一点(理想情况下,具有良好的性能)?

标签: pytorchtensor

解决方案


这是我使用的实现torch.nn.utils.rnn.pad_sequence()

in_tensor = torch.rand((9, 3))
print(in_tensor)
print(36*'=')
lengths = torch.tensor([3, 4, 2])
cum_len = 0
y = []
for idx, val in enumerate(lengths):
    y.append(in_tensor[cum_len : cum_len+val])
    cum_len += val
print(torch.nn.utils.rnn.pad_sequence(y, batch_first=True)))

输出:

# in_tensor of shape (9 x 3)
tensor([[0.9169, 0.3549, 0.6211],
        [0.4832, 0.5475, 0.8862],
        [0.8708, 0.5462, 0.9374],
        [0.4605, 0.1167, 0.5842],
        [0.1670, 0.2862, 0.0378],
        [0.2438, 0.5742, 0.4907],
        [0.1045, 0.5294, 0.5262],
        [0.0805, 0.2065, 0.2080],
        [0.6417, 0.4479, 0.0688]])
====================================
# out tensor of shape (len(lengths) x max(lengths) x b), in this case b is 3
tensor([[[0.9169, 0.3549, 0.6211],
         [0.4832, 0.5475, 0.8862],
         [0.8708, 0.5462, 0.9374],
         [0.0000, 0.0000, 0.0000]],

        [[0.4605, 0.1167, 0.5842],
         [0.1670, 0.2862, 0.0378],
         [0.2438, 0.5742, 0.4907],
         [0.1045, 0.5294, 0.5262]],

        [[0.0805, 0.2065, 0.2080],
         [0.6417, 0.4479, 0.0688],
         [0.0000, 0.0000, 0.0000],
         [0.0000, 0.0000, 0.0000]]])

推荐阅读