PyTorch线性代数¶
作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
所用版本:python 3.6.5,torch 1.6.0,torchvision 0.7.0
1. 标量运算¶
import torch
x = torch.tensor([3.0])
y = torch.tensor([2.0])
x + y, x * y, x / y, x**y
2. 向量运算¶
x = torch.arange(12)
x
x[3]
len(x)
x.shape
y = torch.ones(12, dtype=torch.float32)
y
转换数据类型
x = x.float()
x
点积:给定两个向量$mathbf{x},mathbf{y}inmathbb{R}^d$,它们的点积(dotproduct)$mathbf{x}^ opmathbf{y}$(或$langlemathbf{x},mathbf{y} angle$)是相同位置的按元素乘积的和:$mathbf{x}^ op mathbf{y} = sum_{i=1}^{d} x_i y_i$。
torch.dot(x, y)
torch.sum(x * y)
向量所有元素相乘
torch.prod(x)
torch.prod(y)
x + y
向量所有元素相加
torch.sum(x)
torch.sum(y)
求均值
x.mean()
x.numel()
x_size = float(x.numel())
x.sum() / x_size
将向量转化为矩阵
x.reshape(3, 4)
3. 张量运算¶
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
X
axis=0时,返回矩阵X每一列最大元素所在下标
torch.argmax(X, dim = 0)
axis=1时,返回矩阵X每一行最大元素所在下标
torch.argmax(X, dim = 1)
axis=0时,返回矩阵X每一列求和结果
X.sum(axis = 0)
axis=1时,返回矩阵X每一行求和结果
X.sum(axis = 1)
axis=[0, 1],先对列求和,再对行求和,即矩阵所有元素相加的结果
X.sum(axis = [0, 1])
X.sum()
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
Y
torch.argmax(Y, dim = 0)
torch.argmax(Y, dim = 1)
axis=0时,X与Y按行连接
torch.cat((X, Y), dim=0)
axis=1时,X与Y按列连接
torch.cat((X, Y), dim=1)
矩阵对应元素相加
X + Y
矩阵的转置
Z = X.T
Z
矩阵对应元素相乘
X * Y
矩阵相乘 A=Z*Z'
A = torch.mm(Z, Z.T)
A
构建对称矩阵,A_symm=(A+A')/2
A_symm = (A + A.T) / 2.0
A_symm
判断A_symm是否为对称阵,即A_symm=A_symm'
A_symm == A_symm.T
计算总和或均值时保持轴数不变
sum_X = X.sum(axis=1, keepdims=True)
sum_X
由于sum_X
在对每行进行求和后仍保持两个轴,我们可以通过广播将X
除以sum_X
。
X / sum_X
沿某个轴计算X
元素的累积总和,比如axis=0
(按行计算),我们可以调用cumsum
函数。此函数不会沿任何轴降低输入张量的维度。
X.cumsum(axis=0)
X.cumsum(axis=1)
Z = torch.arange(24).reshape(2, 3, 4)
Z
标量乘以张量
a = 2
a + Z
a * Z
矩阵乘以向量 $$ mathbf{X}mathbf{b} = egin{bmatrix} mathbf{x}^ op_{1} \ mathbf{x}^ op_{2} \ vdots \ mathbf{x}^ op_m \ end{bmatrix}mathbf{b} = egin{bmatrix} mathbf{x}^ op_{1} mathbf{b} \ mathbf{x}^ op_{2} mathbf{b} \ vdots\ mathbf{x}^ op_{m} mathbf{b}\ end{bmatrix}. $$
b = torch.tensor([2.0, 1, 4, 3])
b
X
torch.mv(X, b)
4. 范数¶
2范数
$$|mathbf{x}|_2 = sqrt{sum_{i=1}^n x_i^2},$$
u = torch.tensor([3.0, -4.0])
torch.norm(u, p=2)
1范数
$$|mathbf{x}|_1 = sum_{i=1}^n left|x_i
ight|.$$
torch.abs(u).sum()
torch.norm(u, p=1)
$infty $范数
$$|mathbf{x}|_infty = max(|x_{i}|).$$
import numpy as np
torch.norm(u, p=np.inf)