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拆分的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升