关于数学运算

2022/1/31 23:17:33

本文主要是介绍关于数学运算,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

加、减、乘、除

这里直接用 符号 + - * / 就可以运算,结果和用函数是一样的,不过都要满足能运算的条件,满足broadcasting,

a = torch.rand(3,4)
b = torch.rand(4)
c1 = a + b
c2 = torch.add(a,b)
d = torch.all(torch.eq(a-b,torch.sub(a,b)))  #判断两种方法是否殊途同归
e = torch.all(torch.eq(a*b,torch.mul(a,b)))
f = torch.all(torch.eq(a/b,torch.div(a,b)))
print(c1,'\n',c2),print(d),print(e),print(f)


 矩阵相乘

三种方法:

        torch.mm  :  只适用于二D的 tensor

        torch.matmul  :适合所有的 tensor

        @ :和上一个一样,只不过更简洁,直接乘

a = torch.tensor([[3.,3.],[3.,3.]])
b = torch.ones(2,2)                

o = torch.mm(a,b)
p = torch.matmul(a,b)
q = a @ b
print(a,'\n',b,'\n',o,'\n',p,'\n',q)


关于降维

x = torch.rand(4,784)
w = torch.rand(512,784)     #要降维,pytorch中,第一个是output,第二个是input,
z = ( x @ w.t() )          #所以要转置在相乘降维->(4,512)
print(z.shape)              #.t只适用于二D,以上要用transpose转换


关于matmul 的矩阵相乘

a = torch.rand(4,3,28,64)

b1 = torch.rand(4,3,64,32)
b2 = torch.rand(3,64,32)        #matmul矩阵相乘是后两个维度乘,其他不变,能使用broadcasting
c1 = torch.matmul(a,b1)         #其实就是支持多个矩阵对并行相乘
c2 = torch.matmul(a,b2)
print(c1.shape),print(c2.shape)


pow 、sqrt、rsqrt

三种方法对应

        pow:指定tensor的次方,两种方式,

                1、a.pow(次方 )

                2、pow(a, 次方)

        sqrt:开方,a.sqrt()

        rsqrt:开方后的倒数


使用**也可以达到三种方法任意一种的效果

a = torch.full([2,2],3)
b = pow(a,2)
c = a.pow(2)
aa = a**2                    #乘方
o1 = aa.sqrt()
o2 = aa**(1/2)                #开方
p1 = aa.rsqrt()
p2 = aa**(-1/2)                #开方倒数
print(b,'\n',c,'\n',aa),print(o1,'\n',o2)
print(p1,'\n',p2)


exp、log

exp表示对tensor进行e的次方

log默认底数为e,可以选择log2,log10

a = torch.exp(torch.tensor([[0,1],[2,3]]))
b = torch.log(a)
c = torch.tensor([4,8,16])
c1 = torch.log2(c)
print(a),print(b),print(c1)


近似取值方法

a.floor()表示对a向下取整

a.ceil()表示对a向上取整

a.trunc()表示对a 取整数部分

a.frac()表示对a 取小数部分

a.round()表示对a 四舍五入

a = torch.tensor(3.14)
a1 = a.floor()
a2 = a.ceil()
a3 = a.trunc()
a4 = a.frac()
b = torch.tensor(3.4999)
b1 = b.round()          #四舍五入
c = torch.tensor(3.5)
c1 = c.round()
print(a1,'\n',a2,'\n',a3,'\n',a4)
print(b1,'\n',c1)


梯度裁剪

a.calmp( )

        如果只给出一个值,相当于是最小值,a 中所有小于这个值的都变为这个值,其他不变

        如果给两个值,表示限定在这个区间内,小于小的都变成小的,大于大的都变为大的  >-<

grad = torch.rand(2,3)*15
a = grad.max()      #表示grad中最大值
b = grad.median()       #表示中间值
c = grad.clamp(5,11)    
print(a),print(b),print(c)



这篇关于关于数学运算的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程