Pytorch:通过填充向张量添加维度

问题描述 投票:0回答:1

我给出了不同的张量,其中一些只有 2 维,一些只有 3 维。前两个维度始终匹配。 我希望它们都具有相同的形状以便进一步加工。示例:

张量 a: (1, 10) 张量 b: (1, 10, 15)

现在我的方法是用零将“张量 a”填充为“张量 b”的形状,而不更改任何信息。

在下面的代码片段中,

feature_tensor
可以被视为
tensor a
,而
padding_reference_tensor
可以被视为
tensor b

对于填充,我使用 torch.nn.function.pad。

if feature_tensor.dim() == padding_reference_tensor.dim():
   padding_number = padding_reference_tensor.size()[2] - feature_tensor.size()[2]

elif feature_tensor.dim() < padding_reference_tensor.dim():
   padding_number = padding_reference_tensor.size()[2] - 1

feature_tensor = F.pad(feature_tensor, (0, padding_number), "constant", 0)

feature_tensor.dim() > padding_reference_tensor.dim()
的情况暂时可以忽略。

现在我希望

feature_tensor
从 (1,10) 到 (1,10,15),但它是 (1,24)。

我明白为什么会发生这种情况,但在必要时如何有效地向

feature_tensor
添加维度?

非常感谢!

pytorch padding tensor zero-padding
1个回答
0
投票

Padding 不会向张量添加维度,而是向现有维度添加元素。例如:假设您有一个带有值

(3,)
的矢量形状
[1, 2, 3]
,并且想要将其乘以一个张量形状
(2, 3)
如果您只是用 2 个元素对它进行 0 填充,您将得到一个张量形状
(5,)
[1, 2, 3, 0, 0]
,这对于
(2,3)
张量来说是不好的。

您有两种选择:

  1. 在新维度上重复张量。您可以使用
    torch.repeat
    或更高效的
    torch.expand
    来获取张量
[[1, 2, 3],
 [1, 2, 3]]

然后您可以与任何其他

(2, 3)
形状的张量一起操作。

  1. 最有效、最常见的方法是将
    (3,)
    张量转换为
    (1, 3)
    张量。您可以使用
    unsqueeze()
    方法来做到这一点。这将添加一个大小为 1 的新维度。现在您的
    (1, 3)
    张量可以与任何形状的
    (2, 3)
    张量一起运行。我建议您查看广播语义以获取更多信息。
© www.soinside.com 2019 - 2024. All rights reserved.