在 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 创建一个相同大小的向量,但我认为应该有一种更简单的方法。
您可以首先解压缩适当数量的单例维度,然后使用以下命令展开到目标形状的视图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.reshape或torch.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)
| 归档时间: |
|
| 查看次数: |
8460 次 |
| 最近记录: |