什么是自动拓展
1.自动填充矩阵
Situation 1:
·[4,32,14,14]
·[1,32,1,1]=>[4,32,14,14]
Situation 2:
·[4,32,14,14]
·[14,14]=>[1,1,14,14]=>[4,32,14,14]
Situation 3:
·[4,32,14,14]
·[2,32,14,14]=>失败
import torch
a=torch.ones(2,3,4)
a
a.shape
b=torch.tensor([1.5])
c=torch.add(a,b)
c
结果:
x=torch.tensor([1.5,1.2])
x
y=torch.tensor([1.5],[1.2])
y
x+y
(x+y).shape
结果:
给我的感觉就是一横行下拉+一竖列左拉然后相加
拼接与拆分(Merge or split)
Cat Stack Split Chunk
先看Cat拼接
import torch
a=torch.rand(4,32,8)
b=torch.rand(5,32,8)
a.shape,b.shape
torch.cat([a,b],dim=0.shape)#按照维度拼接
torch.cat([a,b],dim=1.sahpe)#这个会失败,因为第一个维度不匹配后续无法拼接
为什么dim=1会失败
先看下图可知选中的维度得相同,其他的维度不匹配后续无法拼接
举个例子:
a1=torch.rand(4,3,32,32)
a2=torch.rand(4,1,32,32)
torch.cat([a1,a2],dim=1).shape
结果:torch.Size([4,4,32,32])
Stack
cat:沿着一个新维度对输入张量序列进行连接,序列中所有的张量应该为相同形状
stack:当想要加入一个新维度的时候需要stack
举个例子:
a1=torch.rand(5,3,32,32)
a2=torch.rand(5,3,32,32)
torch.stack([a1,a2],dim=2).shape
结果:torch.Size([5,3,2,32,32])
如果说下面这个例子:
a=torch.rand(31,8)
b=torch.rand(30,8)
torch.stack([a,b],dim=0).shape
结果:报错 因为a,b不一样
拆分
x = torch.randn(3,10,6)
x.shape
a,b,c = x.split(1,0)#在0维进行间隔维1的拆分,把张量在0维度以上以间隔1来拆分,其中x在0维度上尺寸为3,就可以分成3份
a.size(),b.size(),c.size()
d,e = x.split(2,0)#在0维进行间隔为2的拆分
d.size(),e.size()#张量在0维度以上间隔2来拆分时,只能分成2份,且只能把面前部分先以间隔2来拆分,后面不足2的部分就直接作为一个分支
l,m,n=x.chunk(3,0)#在0维上拆分成3份
l.size(),m.size(),n.size()
u,v = x.chunk(2,0)#在0维上拆成2份
u.size(),v.size()
结果: