gpt4 book ai didi

python - 填充 torch 张量(或 numpy 数组)列表

转载 作者:行者123 更新时间:2023-12-01 00:37:30 34 4
gpt4 key购买 nike

假设我有一个如下列表:

l = [torch.randn(2,3), torch.randn(2,4),torch.randn(2,5)]

我想在第二个维度中对所有元素进行零填充,这样它们将扩展到 5 个元素(5 是第二个维度中三个元素之间的最大数量)。我怎样才能做到这一点。我尝试过但失败了:

from torch.nn.utils.rnn import pad_sequence
pad_sequence(l, batch_first=True, padding_value=0)

这导致了以下错误:

RuntimeError: The expanded size of the tensor (3) must match the existing size (4) at non-singleton dimension 1.  Target sizes: [2, 3].  Tensor sizes: [2, 4]

Numpy 中的等效答案也将受到赞赏。

最佳答案

一种选择是使用 np.pad

示例:

import numpy as np
a = np.random.randn(2, 3)
b = np.pad(a, [(0, 0), (0, 2)], mode='constant')

打印a给出

[[ 1.22721163  1.23456672  0.51948003]
[ 0.16545496 0.06609003 -0.32071653]]

打印 b 给出

[[ 1.22721163  1.23456672  0.51948003  0.          0.        ]
[ 0.16545496 0.06609003 -0.32071653 0. 0. ]]

pad 的第二个参数是 pad_width,它是每个维度的前/后填充的列表。因此,在此示例中,第一维中没有填充,第二维末尾有两个填充。

您可以使用许多其他 mode 选项,因此请查看文档。

对于您的特定问题,您需要添加一个额外的步骤来计算每个数组的填充。

编辑

对于 pytorch 我认为你想要 torch.nn.functional.pad 例如

import torch
t = torch.randn(2, 3)
torch.nn.functional.pad(t, (0, 2))

编辑2

torch.nn.utils.rnn.pad_sequence 要求列表中所有张量的尾部尺寸相同,因此您需要进行一些转置才能使其正常工作

import torch
# l = [torch.randn(2,3), torch.randn(2,4),torch.randn(2,5)]
# l = [i.transpose(0, 1) for i in l]
# or simply make you tensors with switched dimensions
l = [torch.randn(3,2), torch.randn(4,2),torch.randn(5,2)]
out = torch.nn.utils.rnn.pad_sequence(l, batch_first=True)
# out will now be a tensor with shape (3, 5, 2)
# You can transpose it back to (3, 2, 5) with
out = out.transpose(1, 2)

关于python - 填充 torch 张量(或 numpy 数组)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57628457/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com