一维的拼接
x = torch.arange(1,5)
# tensor[1,2,3,4]
y = torch.arange(5,10)
# tensor[5,6,7,8,9]
torch.cat((x,y),dim=0)
# 这里的dim=0 不能等于1,和torch.stack 要区分
# x y的维度不同 但是也可以进行拼接 但是
# tensor[1,2,3,4,5,6,7,8,9]
二维的拼接
x = torch.range(1,6).view(2,3)
#tensor([[1., 2., 3.],
# [4., 5., 6.]])
y = torch.range(7,12).view(2,3)
#tensor([[ 7., 8., 9.],
# [10., 11., 12.]])
# dim=0
torch.cat((x,y),dim=0)
#输出的结果如下:维度从【2,3】-》【4,3】
'''
tensor([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.],
[10., 11., 12.]])
'''
# dim=1
torch.cat((x,y),dim=1)
# 输出的结果如下:维度由【2,3】-》【2,6】
'''
tensor([[ 1., 2., 3., 7., 8., 9.],
[ 4., 5., 6., 10., 11., 12.]])
'''
如果x 和y的维度不同时,也可以拼接。
x 维度【2,3】 y 维度【2,4】 只能在dim=1 进行拼接 。拼接之后的维度是 【2,7】
同理,x 维度【3,4】,y 维度 【5,4】 只能在dim=0 进行拼接。拼接之后的维度是 【7,4】
也就是必须有一个维度是相同的
三维的拼接
x = torch.range(1,24).view(2,3,4)
'''
tensor([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]],
[[13., 14., 15., 16.],
[17., 18., 19., 20.],
[21., 22., 23., 24.]]])
'''
y = torch.range(-24,-1).view(2,3,4)
'''
tensor([[[-24., -23., -22., -21.],
[-20., -19., -18., -17.],
[-16., -15., -14., -13.]],
[[-12., -11., -10., -9.],
[ -8., -7., -6., -5.],
[ -4., -3., -2., -1.]]])
'''
torch.cat((x,y),dim=0)
# 维度从【2,3,4】-》【4,3,4】 可以看作是 从 第一个方括号开始拼接
'''
tensor([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]],
[[ 13., 14., 15., 16.],
[ 17., 18., 19., 20.],
[ 21., 22., 23., 24.]],
[[-24., -23., -22., -21.],
[-20., -19., -18., -17.],
[-16., -15., -14., -13.]],
[[-12., -11., -10., -9.],
[ -8., -7., -6., -5.],
[ -4., -3., -2., -1.]]])
'''
torch.cat((x,y),dim=1)
# 维度从【2,3,4】-》【2,6,4】 可以看作是 从 第二个方括号开始拼接
'''
tensor([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[-24., -23., -22., -21.],
[-20., -19., -18., -17.],
[-16., -15., -14., -13.]],
[[ 13., 14., 15., 16.],
[ 17., 18., 19., 20.],
[ 21., 22., 23., 24.],
[-12., -11., -10., -9.],
[ -8., -7., -6., -5.],
[ -4., -3., -2., -1.]]])
'''
torch.cat((x,y),dim=3)
# 维度从【2,3,4】-》【2,3,6】 可以看作是 从 第三个方括号开始拼接
'''
tensor([[[ 1., 2., 3., 4., -24., -23., -22., -21.],
[ 5., 6., 7., 8., -20., -19., -18., -17.],
[ 9., 10., 11., 12., -16., -15., -14., -13.]],
[[ 13., 14., 15., 16., -12., -11., -10., -9.],
[ 17., 18., 19., 20., -8., -7., -6., -5.],
[ 21., 22., 23., 24., -4., -3., -2., -1.]]])
'''
如果三维的两个tensor维度不同时,是否可以进行拼接操作,如果可以拼接,又该如何拼接呢?
如果x 的维度是 【2,3,4】,x不发生改变
y 是 【4,2,3】完全不同时 无法 进行拼接操作。
y 是 【4,3,2】时也 无法 在任何维度进行拼接
但是在 y 是 【2,3,6】 时可以在dim=2进行拼接,拼接之后【2,3,10】
y 是 【2,6,4】 时可以在dim=1进行拼接 ,拼接之后【2,9,4】
y 是 【4,3,4】时可以在dim=0进行拼接,拼接之后【6,3,4】
综合以上情况,可以得出,如果两个tensor的形状不同时 ,只有其中的两个维度是相同的情况时,才可以进行拼接操作。
四维拼接
在目标检测任务实现过程中,最常见的时四维的拼接,包括位置编码x y 的拼接、特征图拼接等等。
基于上面的分析,下面的两个四维tensor ,可以当作一个小练习,然后进行实验验证。为了更清楚的显示,只放截图。
x = torch.range(1,120).view(2,3,4,5)
y = torch.range(-120,-1).view(2,3,4,5)
torch.cat((x,y),dim=0)
# 修改dim的值 即可得到最终的结果
# dim=0 -》(4,3,4,5) 也就是在第一个方括号后头进行拼接
# dim=1 -》(2,6,4,5) 第二个方括号后面
# dim=2 -》(2,3,8,5) 第三个方括号后面
# dim=3 -》(2,3,4,10) 第四个方括号后面