【torch.cat】拼接函数详解

在这里插入图片描述

一维的拼接

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)  第四个方括号后面

在这里插入图片描述 在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值