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)