使用 torch.stack()

Dhr*_*ist 8 python pytorch tensor

t1 = torch.tensor([1,2,3])
t2 = torch.tensor([4,5,6])
t3 = torch.tensor([7,8,9])

torch.stack((t1,t2,t3),dim=1)
Run Code Online (Sandbox Code Playgroud)

在实现 torch.stack() 时,我无法理解如何对不同的暗淡进行堆叠。这里对列进行了堆叠,但我无法理解它是如何完成的细节。处理 2-d 或 3-D 张量变得更加复杂。

tensor([[1, 4, 7],
        [2, 5, 8],
        [3, 6, 9]])
Run Code Online (Sandbox Code Playgroud)

Iva*_*van 10

想象一下有n张量。如果我们停留在 3D 中,这些对应于体积,即矩形长方体。堆叠对应于n在附加维度上组合这些体积:这里添加第四个维度来承载n3D 体积。此操作与串联形成鲜明对比,串联中的卷将在现有维度之一上组合上组合。因此,三维张量的串联将产生 3D 张量。

以下是有限尺寸(最多三维输入)的堆叠操作的可能表示:

在此输入图像描述

您选择执行堆叠的位置定义了堆叠将沿哪个新维度进行。在上面的例子中,新创建的维度是最后一个,因此“添加维度”的想法更有意义。

在下面的可视化中,我们观察了张量如何堆叠在不同的轴上。这反过来又会影响最终的张量形状

  • 例如,对于一维情况,它也可能发生在第一个轴上,如下所示:

    在此输入图像描述

    附代码:

    >>> x_1d = list(torch.empty(3, 2))     # 3 lines
    
    >>> torch.stack(x_1d, 0).shape         # axis=0 stacking
    torch.Size([3, 2])
    
    >>> torch.stack(x_1d, 1).shape         # axis=1 stacking
    torch.Size([2, 3])
    
    Run Code Online (Sandbox Code Playgroud)
  • 类似地,对于二维输入:

    在此输入图像描述

    附代码:

    >>> x_2d = list(torch.empty(3, 2, 2))   # 3 2x2-squares
    
    >>> torch.stack(x_2d, 0).shape          # axis=0 stacking
    torch.Size([3, 2, 2])
    
    >>> torch.stack(x_2d, 1).shape          # axis=1 stacking
    torch.Size([2, 3, 2])
    
    >>> torch.stack(x_2d, 2).shape          # axis=2 stacking
    torch.Size([2, 2, 3])
    
    Run Code Online (Sandbox Code Playgroud)

有了这种心态,你就可以直观地将运算扩展到n维张量。