【Pytorch基础】基础点整理3

# 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]])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值