# broadcasting机制
用于做自主扩张
比如对一个年级里,每个班,每个同学,每个科目都加上5分
[4,32,8] + [5]
从最小维度开始匹配
要求是不能不公平 必须公平
# 合并与拆分
#合并
# cat
a = torch.rand(4,32,8)
b = torch.rand(5,32,8)
ab = torch.cat([a,b],dim=0).shape # dim决定在哪个维度上进行合并
print(ab)
# torch.Size([9, 32, 8])
# stack
# 会创建一个新的维度
a = torch.rand(32,8)
b = torch.rand(32,8)
ab = torch.stack([a,b],dim=0).shape
print(ab)
# torch.Size([2, 32, 8])
# dim0 = 0时是a的[32,8],dim0 = 1时是b的[32,8]
要求两个拼接体维度必须一模一样,后面可以索引对应拼接体的内容
# 拆分
# 按长度划分
# 按数量划分
# 数学运算
# 基础tensor的+-*/
torch.a+b = torch.add(a,b)
sub,mul,div同理
# 矩阵的相乘
torch.mm仅限于2D
torch.matmul(a,b) 各种维度均可使用
numpy里的@也是一样的
# 次方
a = torch.full([2,2],3)
# 平方
a = a**2
print(a)
# 平方根
a = a**2
b = a.sqrt()
print(b)
# 平方根的倒数
b = a.rsqrt()
print(b)
# 开方,用分数表示开几次方
b = a**(0.5)
print(b)
# tensor([[9, 9],
# [9, 9]])
# tensor([[9., 9.],
# [9., 9.]])
# tensor([[0.1111, 0.1111],
# [0.1111, 0.1111]])
# tensor([[9., 9.],
# [9., 9.]])
# 指数,对数
a = torch.exp(torch.ones(2,2))
print(a)
b = torch.log(a)
print(b)
# tensor([[2.7183, 2.7183],
# [2.7183, 2.7183]])
# tensor([[1., 1.],
# [1., 1.]])
# floor()退一取整; ceil()进一取整; trunc()取整数;frac()取小数;round()四舍五入
# clamp()裁剪
gradient clipping梯度裁剪
# 属性统计
# 求范数
# 其他常用统计属性
a = torch.arange(8).view(2,4).float()
print(a)
print(a.min(),a.max(),a.mean(),a.prod()) # 最小,最大,均值,累乘
print(a.sum()) # 累加
print(a.argmax(),a.argmin()) # 打平之后最大值和最小值的定位所在
# tensor([[0., 1., 2., 3.],
# [4., 5., 6., 7.]])
# tensor(0.) tensor(7.) tensor(3.5000) tensor(0.)
# tensor(28.)
# tensor(7) tensor(0)
argmax,argmin默认打平,不打平如下
a = torch.rand(4,10)
b = a.argmax(dim=1)
print(b) # 加上了维度,定位每一行10个元素里的最大值所在的位置
# tensor([9, 2, 6, 8])
如果这里dim=0,也就是在4上面定位最大值,则返回[10]
print(a.max(dim=1)) # 输出的是最大值和位置
print(a.max(dim=1,keepdim=True)) #输出的保持和输入相同的维度
# torch.return_types.max(
# values=tensor([0.9806, 0.8874, 0.9532, 0.9586]),
# indices=tensor([8, 1, 8, 8]))
# torch.return_types.max(
# values=tensor([[0.9806],
# [0.8874],
# [0.9532],
# [0.9586]]),
# indices=tensor([[8],
# [1],
# [8],
# [8]]))
print(a.topk(3,dim=1)) # 输出前三大的数值和位置,并且保持维度不变
print(a.topk(3,dim=1,largest=False)) # 最大为false,则为最小的几个
print(a.kthvalue(8,dim=1)) # 输出为第八小的数值,可以且只可以是第几小
print(a.kthvalue(3))
# torch.return_types.topk(
# values=tensor([[0.9759, 0.9325, 0.8598],
# [0.9361, 0.8225, 0.8046],
# [0.8140, 0.8048, 0.7814],
# [0.9299, 0.8470, 0.7759]]),
# indices=tensor([[0, 1, 6],
# [4, 1, 7],
# [3, 7, 0],
# [4, 5, 1]]))
# torch.return_types.topk(
# values=tensor([[0.0168, 0.0436, 0.4475],
# [0.0801, 0.1578, 0.2140],
# [0.0050, 0.1379, 0.1417],
# [0.2989, 0.4003, 0.4045]]),
# indices=tensor([[8, 2, 5],
# [3, 8, 0],
# [5, 8, 9],
# [3, 0, 2]]))
# torch.return_types.kthvalue(
# values=tensor([0.8598, 0.8046, 0.7814, 0.7759]),
# indices=tensor([6, 7, 0, 1]))
# torch.return_types.kthvalue(
# values=tensor([0.4475, 0.2140, 0.1417, 0.4045]),
# indices=tensor([5, 0, 9, 2]))
# 比较大小
返回的值(True用1表示,False用0表示)
a>0和torch.gt(a,0)是一样的
>, >=, <, <=, !=, ==
torch.eq(a,b) / torch.equal(a,b)
print(a>0)
# tensor([[True, True, True, True, True, True, True, True, True, True],
# [True, True, True, True, True, True, True, True, True, True],
# [True, True, True, True, True, True, True, True, True, True],
# [True, True, True, True, True, True, True, True, True, True]])
a = torch.ones(2,3)
b = torch.rand(2,3)
print(torch.eq(a,b))
print(torch.equal(a,a))
# tensor([[False, False, False],
# [False, False, False]])
# True
# 高度并行的逻辑实施控制 Where
cond = torch.rand(2,2)
print(cond)
a = torch.zeros(2,2)
b = torch.ones(2,2)
print(torch.where(cond>0.5,a,b)) # 如果cond的值大于0.5,则读取a的值,反之读取b的值,位置是相对应的
# tensor([[0.8724, 0.5604],
# [0.1742, 0.7077]])
# tensor([[0., 0.],
# [1., 0.]])
# gather收集指令,查表
从relative查询到global
prob = torch.randn(4,10)
idx = prob.topk(dim=1,k=3)
print(idx)
# torch.return_types.topk(
# values=tensor([[ 1.5939, 1.3829, -0.2062],
# [ 0.8020, 0.7701, 0.4914],
# [ 2.1825, 2.1733, 0.8975],
# [ 1.4720, 1.0075, 0.7402]]),
# indices=tensor([[8, 2, 9],
# [8, 5, 0],
# [6, 4, 2],
# [4, 2, 6]]))
idx = idx[1]
print(idx)
# tensor([[8, 2, 9],
# [8, 5, 0],
# [6, 4, 2],
# [4, 2, 6]])
label = torch.arange(10)+100
print(label)
# tensor([100, 101, 102, 103, 104, 105, 106, 107, 108, 109])
# 将表扩充到[4,10],并且在dim=1里面查询,idx里面是[4,3],对应查询
print(torch.gather(label.expand(4,10),dim=1,index=idx.long()))
# tensor([[108, 102, 109],
# [108, 105, 100],
# [106, 104, 102],
# [104, 102, 106]])