如何使用torch.stack函数

조수호*_*조수호 7 python pytorch tensor

我有一个关于torch.stack的问题

我有2个张量,a.shape =(2,3,4)和b.shape =(2,3)。 如何在不进行就地操作的情况下堆叠它们

arj*_*onn 20

堆叠需要相同数量的尺寸。一种方法是解压和堆叠。例如:

a.size()  # 2, 3, 4
b.size()  # 2, 3
b = torch.unsqueeze(b, dim=2)  # 2, 3, 1
# torch.unsqueeze(b, dim=-1) does the same thing

torch.stack([a, b], dim=2)  # 2, 3, 5
Run Code Online (Sandbox Code Playgroud)

  • 这个答案对于 `torch.stack([a, b], dim=2)` 是不正确的,相反,您想使用 @drevicko 正确提到的 `torch.cat([a,b], dim=2)` 。`torch.cat` 连接给定维度中的序列,而 `torch.stack` 连接新维度中的序列,如下所述:/sf/ask/3801505781/ Between-torch -stack-and-torch-cat-functions/54307331 。 (9认同)
  • 您想要的是将 [torch.cat](https://pytorch.org/docs/stable/torch.html#torch.cat) 与“unsqueeze”一起使用,就像您所做的那样。[torch.stack](https://pytorch.org/docs/stable/torch.html#torch.stack) 创建一个新维度,并且所有提供的张量必须具有相同的大小。 (4认同)
  • 这不会运行。相反,您将收到“运行时错误:堆栈期望每个张量大小相等,但在条目 0 处得到 [2, 3, 4],在条目 1 处得到 [2, 3, 1]” (2认同)

gil*_*des 13

使用 pytorch 1.2 或 1.4 arjoonn 的答案对我不起作用。

而不是torch.stack我使用torch.catpytorch 1.2 和 1.4:

>>> import torch
>>> a = torch.randn([2, 3, 4])
>>> b = torch.randn([2, 3])
>>> b = b.unsqueeze(dim=2)
>>> b.shape
torch.Size([2, 3, 1])
>>> torch.cat([a, b], dim=2).shape
torch.Size([2, 3, 5])
Run Code Online (Sandbox Code Playgroud)

如果要使用torch.stack张量的尺寸必须相同:

>>> a = torch.randn([2, 3, 4])
>>> b = torch.randn([2, 3, 4])
>>> torch.stack([a, b]).shape
torch.Size([2, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

这是另一个例子:

>>> t = torch.tensor([1, 1, 2])
>>> stacked = torch.stack([t, t, t], dim=0)
>>> t.shape, stacked.shape, stacked

(torch.Size([3]),
 torch.Size([3, 3]),
 tensor([[1, 1, 2],
         [1, 1, 2],
         [1, 1, 2]]))
Run Code Online (Sandbox Code Playgroud)

有了stack这个dim参数,您就可以指定在哪个维度上堆叠具有相同维度的张量。


pou*_*rya 5

假设你有两个张量 a, b ,它们的维度相等,即 a ( A, B, C) 所以 b (A, B , C) 一个例子

a=torch.randn(2,3,4)
b=torch.randn(2,3,4)
print(a.size())  # 2, 3, 4
print(b.size()) # 2, 3, 4

f=torch.stack([a, b], dim=2)  # 2, 3, 2, 4
f
Run Code Online (Sandbox Code Playgroud)

如果它们不一样暗淡,它就不会起作用。当心!!