torch.stack([t1, t1, t1], dim=1) 与 torch.hstack([t1, t1, t1]) 之间的区别是什么?

huangapple go评论80阅读模式
英文:

what is the difference between torch.stack([t1,t1,t1],dim=1) and torch.hstack([t1,t1,t1])?

问题

使用不同的方法进行水平堆叠时,对于相同的向量会产生两种不同的输出。

  1. 使用 torch.stack([t1,t1,t1],dim=1) 方法:
t1_stack = torch.stack([t1,t1,t1],dim=1)
t1_stack,t1_stack.shape

输出:

(tensor([[5., 5., 5.],
         [2., 2., 2.],
         [3., 3., 3.],
         [4., 4., 4.],
         [5., 5., 5.],
         [6., 6., 6.],
         [7., 7., 7.],
         [8., 8., 8.],
         [9., 9., 9.]]),
 torch.Size([9, 3]))
  1. 使用 torch.hstack([t1,t1,t1]) 方法:
h_stack = torch.hstack([t1,t1,t1])
h_stack,h_stack.shape

输出:

(tensor([5., 2., 3., 4., 5., 6., 7., 8., 9., 5., 2., 3., 4., 5., 6., 7., 8., 9.,
         5., 2., 3., 4., 5., 6., 7., 8., 9.]),
 torch.Size([27]))

这两种方法的不同之处在于:

  • torch.stack 沿着指定的维度(这里是dim=1,即水平维度)将输入的张量序列堆叠起来,因此在结果中你得到了一个形状为 [9, 3] 的二维张量,其中每个向量都作为一行出现。

  • torch.hstack 不是一个PyTorch内置函数,可能是你自己实现的一个水平堆叠函数。它将输入的张量序列在水平方向拼接,所以结果是一个形状为 [27] 的一维张量,其中所有的值都水平排列在一起。

因此,不同的方法导致了不同的输出形状和排列方式。

英文:

Technically, both the methods torch.stack([t1,t1,t1],dim=1) and torch.hstack([t1,t1,t1]) performs the same operation i.e they both horizontally stack the vectors.
But when I performed both on a same vector but they yield 2 different outputs can someone explain why ?

Taken tensor t1 :

# Code : 
t1 = torch.arange(1.,10.)
t1,t1.shape
# Output : 
(tensor([1., 2., 3., 4., 5., 6., 7., 8., 9.]), torch.Size([9]))

Using torch.stack([t1,t1,t1],dim=1)

# Code :
t1_stack = torch.stack([t1,t1,t1],dim=1)
#  dim value lies between [-2,1]
# -2 and 0 stack vertically
# -1 and 1 stack Horizontally
t1_stack,t1_stack.shape
# Output :
(tensor([[5., 5., 5.],
         [2., 2., 2.],
         [3., 3., 3.],
         [4., 4., 4.],
         [5., 5., 5.],
         [6., 6., 6.],
         [7., 7., 7.],
         [8., 8., 8.],
         [9., 9., 9.]]),
 torch.Size([9, 3]))

Using torch.hstack([t1,t1,t1])

# Code : 
h_stack = torch.hstack([t1,t1,t1])
h_stack,h_stack.shape
# Output : 
(tensor([5., 2., 3., 4., 5., 6., 7., 8., 9., 5., 2., 3., 4., 5., 6., 7., 8., 9.,
         5., 2., 3., 4., 5., 6., 7., 8., 9.]),
 torch.Size([27]))

It gives 2 different outputs for same vector while using different methods for horizontal stacking

答案1

得分: 2

查看PyTorch文档:

  • hstack: "这相当于在1-D张量的第一个轴上进行连接"。
  • stack: "沿着新的维度连接一个张量序列"。

所以显然在您的情况下(1-D张量),这不是完全相同的操作。

英文:

Looking at the pytorch doc:

  • hstack: "This is equivalent to concatenation along the first axis for 1-D tensors".
  • stack: "Concatenates a sequence of tensors along a new dimension."

So apparently this is not exactly the same operation in your case (1-D tensor).

huangapple
  • 本文由 发表于 2023年7月3日 15:17:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/76602606.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定