从技术上讲,torch.stack([t1,t1,t1],dim=1) 和 torch.hstack([t1,t1,t1]) 方法执行相同的操作,即它们都水平堆叠向量。 但是当我在同一个向量上执行这两个操作但它们产生 2 个不同的输出时,有人可以解释为什么吗?
获取张量 t1 :
# Code :
t1 = torch.arange(1.,10.)
t1,t1.shape
# Output :
(tensor([1., 2., 3., 4., 5., 6., 7., 8., 9.]), torch.Size([9]))
使用 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]))
使用 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]))
它为同一向量提供 2 个不同的输出,同时使用不同的方法进行水平堆叠
关于hstack使用的官方文档,它说“水平排列张量(按列)。这相当于一维张量沿第一个轴串联,沿第二个轴串联对于所有其他张量。” 在您的示例中,使用 hstack 后,新张量的形状与原始张量具有相同的维度。而使用堆栈后,您的新张量将多一维形状。
看例子会更清楚。
a = torch.tensor([[1],[2],[3]])
b = torch.tensor([[4],[5],[6]])
hstack_ab = torch.hstack((a,b))
stack_ab = torch.stack((a,b), dim=1)
print(hstack_ab)
print(stack_ab)
print(a.shape, b.shape)
print(hstack_ab.shape, stack_ab.shape)
然后你会得到如下结果:
tensor([[1, 4],
[2, 5],
[3, 6]])
tensor([[[1],
[4]],
[[2],
[5]],
[[3],
[6]]])
torch.Size([3, 1]) torch.Size([3, 1])
torch.Size([3, 2]) torch.Size([3, 2, 1])