有重载运算符 和 函数两种方法进行张量的运算
import torch
import numpy as np
a = torch.rand(2,3)
b = torch.rand(3)
# 这里b 使用了 broatcasting 自动进行了维度扩展
print("运算符 + 与 add() 方法运算结果一致:{} ".format(torch.all(torch.eq(torch.add(a,b),a+b))))
print("运算符 - 与 sub() 方法运算结果一致:{} ".format(torch.all(torch.eq(torch.sub(a,b),a-b))))
print("运算符 * 与 mul() 方法运算结果一致:{} ".format(torch.all(torch.eq(torch.mul(a,b),a*b))))
print("运算符 / 与 div() 方法运算结果一致:{} ".format(torch.all(torch.eq(torch.div(a,b),a/b))))
运算符 + 与 add() 方法运算结果一致:True
运算符 - 与 sub() 方法运算结果一致:True
运算符 * 与 mul() 方法运算结果一致:True
运算符 / 与 div() 方法运算结果一致:True
矩阵相乘 torch.matmul(只取最后两维度进行运算), @(是matmul方法的重载) 两种方法
import torch
import numpy as np
a = torch.rand(2,3)
b = torch.rand(3,4)
print("运算符 @ 与 matmul 方法运算结果一致:{} ".format(torch.all(torch.eq(torch.matmul(a,b),a@b))))
print("运算后张量的 shape: {}".format((a@b).shape))
运算符 @ 与 matmul 方法运算结果一致:True
运算后张量的 shape: torch.Size([2, 4])
pow / ** 幂运算
import torch
import numpy as np
a = torch.full([2,2],2)
print("a 的二次方: {}".format(a.pow(2)))
print("a 的三次方: {}".format(a**3))
#平方根
print("a 的平方根: {}".format(torch.sqrt(a.pow(2))))
a 的二次方: tensor([[4., 4.],
[4., 4.]])
a 的三次方: tensor([[8., 8.],
[8., 8.]])
a 的平方根: tensor([[2., 2.],
[2., 2.]])
exp / log
import torch
import numpy as np
a = torch.exp(torch.ones(2,2))
print("e 为: {}".format(a))
print("e 取log : {}".format(torch.log(a)))
e 为: tensor([[2.7183, 2.7183],
[2.7183, 2.7183]])
e 取log : tensor([[1., 1.],
[1., 1.]])
clamp 范围限幅 (min)将低于min的值裁剪为min , (min,max) 将数据低于min 裁剪为min,高于max裁剪为max
import torch
import numpy as np
a = torch.randn(2,3)
print("a 为: {}".format(a))
print("a 裁剪后为 : {}".format(a.clamp(0.1)))
print("a 裁剪后为 : {}".format(a.clamp(0.1,0.3)))
a 为: tensor([[-0.4780, -0.2077, 0.3702],
[-1.5801, -0.0170, 0.6737]])
a 裁剪后为 : tensor([[0.1000, 0.1000, 0.3702],
[0.1000, 0.1000, 0.6737]])
a 裁剪后为 : tensor([[0.1000, 0.1000, 0.3000],
[0.1000, 0.1000, 0.3000]])