Broadcasting、合并and拆分

2022/1/30 23:08:52

本文主要是介绍Broadcasting、合并and拆分,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 broadcasting

它的功能就是能够实现自动维度的扩展,使两个tensor的shape相同,

也就是说节省了 unsqueeze 和 expand 操作,高效并且不需要复制数据,节省内存


关键思想

    

 只有size一致才能进行对应位置元素的相加


如下图,第一行,两个tensor的shape相等,可以直接相加

第二行,第二个tensor根据第一个tensor扩张到相同shape,在复制数据对应相加

第三行, 两个tensor根据对方维度扩展到shape相同,相加


能否进行broadcasting

broadcasting 操作是从tensor的最后一个维度开始的

如果前面没有维度,那就补1直到两个tensor的维度相等,

然后判断 如果该tensor中某维度有size不为1的

        ·  与领一个tensor对应相同,可以broadcasting

        ·  不同就不能broadcasting 

情形一:

 情形二:

 情形三:


合并

两种方法:cat    ,     stack 


 cat

要保证要合并的tensor的维度相同,要合并的那一维size可以不一样,其他维size必须相等

 使用方法:torch.cat ( [  ]  ,  dim =  )

        将要合并的tensor放到一个列表中,指明合并的维度

a = torch.rand(4,32,8)
b = torch.rand(5,32,8)
d = torch.rand(2,32,8)
c = torch.cat([a,b,d],dim=0)  #对第0维相加,其他一样
print(c.shape)


stack

条件:要合并的tensor所有的维度shape都相等

使用和cat差不多,不过是dim= 是指在哪一维增加一个维度

二者区别:

        stack是创建一个新的维度,将要合并的tensor包在里面,

        cat是对一个维度的扩张

a = torch.rand(24,36,48)
b = torch.rand(24,36,48)
c = torch.rand(24,36,48)
d = torch.stack([a,b,c],dim=1)
print(d.shape)


拆分

split是按长度来拆分的,chunk是按数量来拆分的

split 

假如tensor A 需要拆分

可以  A.split ( num ,dim=    )

        num表示按照 num 的大小分割,dim表示对哪一维进行分割

或者   A.split ( [   ]  ,dim=    )

        在列表中填具体的数字表示分割后这一维的shape,不过列表中数字之和要等于dim的shape

要根据拆分的个数接收对应的tensor

a = torch.rand(4,32,8)
b,c ,d,e= a.split(1,dim=0)
bb,cc = a.split([3,1],dim=0)
print(b.shape),print(c.shape)
print(bb.shape),print(cc.shape)


chunk

直接输入在哪个维度分为多少块

a = torch.rand(4,32,8)
b,c,d,e = a.chunk(4,dim=1)  #将第一维拆分为4个tensor
print(b.shape),print(c.shape)



这篇关于Broadcasting、合并and拆分的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程