我给出了不同的张量,其中一些只有 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
添加维度?
非常感谢!
Padding 不会向张量添加维度,而是向现有维度添加元素。例如:假设您有一个带有值
(3,)
的矢量形状 [1, 2, 3]
,并且想要将其乘以一个张量形状 (2, 3)
如果您只是用 2 个元素对它进行 0 填充,您将得到一个张量形状 (5,)
值 [1, 2, 3, 0, 0]
,这对于 (2,3)
张量来说是不好的。
您有两种选择:
torch.repeat
或更高效的 torch.expand
来获取张量[[1, 2, 3],
[1, 2, 3]]
然后您可以与任何其他
(2, 3)
形状的张量一起操作。
(3,)
张量转换为 (1, 3)
张量。您可以使用 unsqueeze()
方法来做到这一点。这将添加一个大小为 1 的新维度。现在您的 (1, 3)
张量可以与任何形状的 (2, 3)
张量一起运行。我建议您查看广播语义以获取更多信息。