21合并与分割2
split
按照长度/单元长度拆分
c的shape是[2,32,8]
aa,bb=c.split(1,dim=0)#操作单元是在0维度上操作,拆分单元长度是1
aa,bb=c.split(2,dim=0)#报错 dim=0长度才是2,但是拆分长度要求2,拆不开,split必须拆分
c的shape是[3,32,8]
aa,bb=c.split([2,1],dim=0)#操作单元是在0维度上操作,拆分单元长度是2和1
import torch
a=torch.rand(32,8)
b=torch.rand(32,8)
c=torch.stack([a,b],dim=0)
print(c.shape)#torch.Size([2, 32, 8])
c=torch.rand(5,32,8)
aa,bb=c.split([4,1],dim=0)#在dim=0上 把5分成4,1
print(aa.shape)#torch.Size([4, 32, 8])
print(bb.shape)#torch.Size([1, 32, 8])
aa,bb,cc=c.split([2,2,1],dim=0)#在dim=0上 把5分成2,2,1
print(aa.shape)#torch.Size([2, 32, 8])
print(bb.shape)#torch.Size([2, 32, 8])
print(cc.shape)#torch.Size([1, 32, 8])
chunk 要拆分几个单位,split是拆分的单位多长
22数学运算
Math operation
▪ Add/minus/multiply/divide
▪ Matmul
▪ Pow
▪ Sqrt/rsqrt
▪ Round
basic
加减乘数可以直接用±*/ 其中//表示整除
也可用add sub mul div
matmul
矩阵乘法中
.*是相同位置相乘
.matmul是矩阵乘法
可以用@或者.matmul,.mm只用在2d
例子
(4,784)降维成(4,512) 所以(4,784)@(784,512),但是一般用于变换的矩阵w是写成(ch-out,ch-in)所以784是in,512是out,所以要乘以w的转置,w.t(),.t只用于二维的,其他要用transpose
大于2d的均值乘法
a[4,3,28,64]
b[4,3,64,32]
torch.matmul(a,b)
#前两维不变,后面(28,64)@(64,32)所以最终是[4,3,28,32]
a[4,3,28,64]
b[4,1,64,32]
torch.matmul(a,b)
#b中的1可以通过broadcast变成3,保持前两维度相同,后面(28,64)@(64,32)所以最终是[4,3,28,32]
a[4,3,28,64]
b[4,64,32]
torch.matmul(a,b)
#b中的4不可以还是a中的3都不是1不能通过broadcast,所以报错
power
求幂运算
a.pow(2)#平方
a2#平方
aa.sqrt()#平方根
aa.rsqrt()#平方根的导数
a(0.5)#开方
exp log
log默认以e为底,e=2.7183
改变底直接写log2.(a)或者log10.(a)
a=torch.exp(torch.ones(2,2))
print(a)
b=torch.log(a)
c=torch.log2(a)
d=torch.log10(a)
print(b,c,d)
'''
tensor([[2.7183, 2.7183],
[2.7183, 2.7183]])
tensor([[1., 1.],
[1., 1.]]) tensor([[1.4427, 1.4427],
[1.4427, 1.4427]]) tensor([[0.4343, 0.4343],
[0.4343, 0.4343]])
'''
Approximation
近似值
▪ .floor() #下限 往小的取
▪ .ceil()#上限 天花板 往大的取
▪ .round()#四舍五入
▪ .trunc()#裁剪成整数部分
▪ .frac()#裁剪成小数部分
clamp
裁剪梯度
梯度离散 梯度很小趋近于0
梯度爆炸 梯度很大大于10,可以打印w.grad.norm(2)看这个数值
a=torch.rand(2,3)#0-1分布
print(a)
grad=a*15#15倍放大
print(grad)
print(grad.max())
print(grad.median())
print(grad.clamp(10))#(min)小于10的位置补成10
print(grad)
print(grad.clamp(0,10))#大于10的位置补成10 (min,max)
'''
tensor([[0.0980, 0.3470, 0.5863],
[0.7546, 0.1118, 0.9067]])
tensor([[ 1.4703, 5.2043, 8.7948],
[11.3190, 1.6768, 13.6002]])
tensor(13.6002)
tensor(5.2043)
tensor([[10.0000, 10.0000, 10.0000],
[11.3190, 10.0000, 13.6002]])
tensor([[ 1.4703, 5.2043, 8.7948],
[11.3190, 1.6768, 13.6002]])
tensor([[ 1.4703, 5.2043, 8.7948],
[10.0000, 1.6768, 10.0000]])
'''
23统计属性1
statistics
▪ norm
▪ mean sum
▪ prod
▪ max, min, argmin, argmax
▪ kthvalue, topk
norm
这里的norm是范数的意思,不是normalize正则化
norm-p
b.norm(1,dim=1)#在dim=1上进行1的norm,是第二行的求和 shape是[2] 维度是1
b.norm(2,dim=0)#在dim=0上进行2的norm,是第二行的求和结果再开方 shape是[2] 维度是1
对于c而言 dim=0是最外层的维度,取哪个维度的范数那个维度就消掉
mean, sum, min, max, prod(累乘)
argmax就是将整个tensor打平后max的索引值
argmin就是将整个tensor打平后min的索引值
a.argmax(dim=1)在每一行中找最大值的索引,可以理解为在手写数字中找每张图片中概率最大的那个label,dim=1是在10上做索引,返回的shape是[4]
如果在dim=0是在4上做索引,返回的shape是[10]
24属性统计2
dim keepdim
keepdim是让max之后的索引维度(本来是1维度 只有一行就是每张图片最大值的索引值)和原来a的维度(本来是2维度 4行10列)保持一致
top-k k-th
top-k默认返回最大的k个,找最小的k个largest设置为false
k-th返回第k小的value
compare
equal就是整体比
eq就是比每个内容单独比
25高阶操作
where
适用于分布采样,就是不规则的赋值,完成逻辑时序控制,这样可以运行在gpu上
概率p越大越可能取a ,概率越小越可能取b,
p=0.5大于0.5取a,a值是0,小于0.5取b ,b值是1
gather
实现从reletive到global的一个映射
7,4,9到107,104,109
long是类型转换