将张量展开几个维度

cer*_*rou 6 pytorch tensor

在 PyTorch 中,给定一个长度为的张量(向量)n,如何将其扩展几个维度,将张量中的每个条目增强并复制到这些维度?例如,给定一个 size 的张量,(3)将其扩展为 size= (3,2,5,5),使得添加的维度具有原始张量的相应值。在这种情况下,令 size=(3)和 vector=[1,2,3]使得 size 的第一个张量(2,5,5)具有值1,第二个张量具有所有值2,第三个张量具有所有值3

另外,如何将size向量展开(3,2)(3,2,5,5)

我能想到的一种方法是使用 Ones-Like 创建一个相同大小的向量,然后用 einsum 创建一个相同大小的向量,但我认为应该有一种更简单的方法。

Iva*_*van 4

您可以首先解压缩适当数量的单例维度,然后使用以下命令展开到目标形状的视图torch.Tensor.expand

>>> x = torch.rand(3)
>>> target = [3,2,5,5]

>>> x[:, None, None, None].expand(target)
Run Code Online (Sandbox Code Playgroud)

一个很好的解决方法是使用torch.Tensor.reshapetorch.Tensor.view执行多次解压:

>>> x.view(-1, 1, 1, 1).expand(target)
Run Code Online (Sandbox Code Playgroud)

这允许使用更通用的方法来处理任意目标形状:

>>> x.view(len(x), *(1,)*(len(target)-1)).expand(target)
Run Code Online (Sandbox Code Playgroud)

对于更一般的实现,其中x可以是多维的:

>>> x = torch.rand(3, 2)

# just to make sure the target shape is valid w.r.t to x
>>> assert list(x.shape) == list(target[:x.ndim])

>>> x.view(*x.shape, *(1,)*(len(target)-x.ndim)).expand(target)
Run Code Online (Sandbox Code Playgroud)