一、创建张量
由数组创建张量
arr = [1,3,4,9]
t = torch.tensor(arr)
由numpy创建张量
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)
创建3x3全为0的张量
t = torch.zeros((3, 3), out=out_t)
创建形状与arr相同的全为0的张量
arr = torch.tensor([[2,4,3],[5,3,4]])
t = torch.zeros_like(arr)
创建全为1的3x3张量
t = torch.full((3, 3), 1)
从2到10创建张量,步长为2
t = torch.arange(2, 10, 2)
创建2到10张量,均分6份
t = torch.linspace(2, 10, 6)
创建3阶单位矩阵
t = torch.eye(3)
创建4x5张量,全部元素服从均值为1,方差为2正态分布
t = torch.normal(1, 2, [4,5], generator=None, out=None)
创建3x4张量,全部元素服从标准正态分布
t = torch.randn([3,4])
创建3x4张量,全部元素服从均匀分布,取值0~1
t = torch.rand([3,4])
创建3x4张量,全部元素服从均匀分布,取值2~85
t = torch.randint(2,85,[3,4])
二、张量操作
维度0上将两个张量拼接
t1 = torch.cat([a1, a2], dim = 0)
把张量在维度1上均分为3份
t1 = torch.chunk(a1, 3, dim=1)
把张量在维度0上分为两份,一份长度2,另一份0
t1 = torch.split(a1, [2,1], dim=0)
把张量在维度0上取出索引为0和2两个张量
a2 = torch.tensor([0,2])
t1 = torch.index_select(a1, 0, index=a2, out=None)
改变张量形状为9行1列
t1 = torch.reshape(a1, (9, 1))
三、张量运算
张量加减乘除
t1 = torch.add(a1, a2)
t1 = torch.sub(a1, a2)
t1 = torch.mul(a1, a2)
t1 = torch.div(a1, a2)
x张量的n次方
torch.pow(x, n)
x张量的绝对值
torch.abs(x)
x张量取负数
torch.neg(x)
x张量取倒数
torch.reciprocal(x)
x张量取平均数
torch.mean(x)
x张量取sigmoid
torch.sigmoid(x)
x张量总数
torch.sum(x)
x张量最大值
torch.max(x)
x张量最小值
torch.min(x)
x张量最上取整数
torch.ceil(x)
x张量以e为底数,计算指数
torch.exp(x)
四、线性代数
矩阵点积
t1 = torch.dot(a1, a2)
矩阵与向量相乘
a1 = torch.tensor([[1, 2],[4, 5]])
a2 = torch.tensor([7, 8])
t1 = torch.mv(a1, a2)
矩阵相乘
a1 = torch.tensor([[1, 2],[4, 5]])
a2 = torch.tensor([[7, 8],[6, 9]])
t1 = torch.mm(a1, a2)
求矩阵a1特征值和特征向量
a1 = torch.tensor([[1., 2.],[4., 5.]])
t1 = torch.eig(a1, eigenvectors=True)
求矩阵a1逆矩阵
a1 = torch.tensor([[1., 2.],[4., 5.]])
t1 = torch.inverse(a1)
向量a1单位化
a1 = torch.tensor([[0., -1., -1.]],dtype=torch.float64)
torch.nn.functional.normalize(a1)
五、求梯度
import torch
w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)
a = torch.add(w, x)
b = torch.add(w, 1)
y = torch.mul(a, b)
a.retain_grad() #非叶子节点,保留梯度用retain_grad()
b.retain_grad() #非叶子节点,保留梯度用retain_grad()
y.backward() # y 求导
#y.backward(retain_graph=True) 保留计算图,用于多次求导
print(a.grad) # 查看 a 梯度
print(b.grad) # 查看 b 梯度
print(w.grad) # 查看 w 梯度,叶子节点直接查看梯度
w.grad.zero_() # 梯度清零
自动求导
x = torch.tensor([3.], requires_grad=True)
y = torch.tensor([5.], requires_grad=True)
a = torch.add(x, y)
b = torch.mul(x, y)
z = torch.pow(a, b)
grad_1 = torch.autograd.grad(z, [x,y,a,b], create_graph=True)
print(grad_1)