线性代数
具体实现
-
标量
import torch x = torch.tensor(3.0) # 由一个元素3组成的张量 y = torch.tensor(2.0) # 由一个元素4组成的张量 x + y, x * y, x / y, x**y # 标量可以进行基本运算
result:
(tensor(5.), tensor(6.), tensor(1.5000), tensor(9.))
-
向量
通过张量的索引来访问任意元素
x = torch.arange(4) # x = [0, 1, 2, 3] X = x[3] # X = 3 注意下标从0开始 length = len(x) # length = 4 访问张量的长度 print(x.shape) # torch.Size([4]) 访问张量形状 n维张量的形状为 torch.Size([l1, l2, l3, ..., ln]), l为对应维度的长度
创建二维矩阵:
A = torch. arange(20).reshape(5, 4) # 创建5*4的矩阵 B = A.T # 矩阵转置
对称矩阵:转置为矩阵本身
A == A.T # 判断是否为对称矩阵
创建更多维矩阵:
X = torch.arange(24).reshape(2, 3, 4) # 三维矩阵 2块3行4列
X的值:
tensor([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])
-
两个相同张量的运算
A = torch.arange(20, dtype=torch.float32).reshape(5, 4) B = A.clone() # 通过分配新内存,将A的一个副本分配给B """ 需要注意的是,直接使用赋值语句B = A的话 两者实质上还是指向同一张量,任何对其中一方所做的改变都会影响到另一方 """ A * B # 按对应位置元素分别相乘 A.sum() # 张量求和 对每个元素求和 返回标量 # sum()函数可以接受一个参数 axis 通过指定axis的值决定张量沿哪一个轴求和 axis=[求和维度] A.mean() # 对张量求平均值 同样可以接受axis按某一维度计算 sum_A = A.sum(axis=1, keepdims=True) # 沿轴0计算A元素的累计总和 cumsum函数不会降低维度 A.cumsum(axis=0)
keepdims可以在计算时使轴数保持不变 即不会降维,axis对应的轴长度会被设置为1.用途是在使用广播机制时保持了相同的维度可以进行A/sum_A操作.
-
向量点积
y = torch.ones(4, dtype = torch.float32) x = torch.ones(4, dtype = torch.float32) # 结果: tensor((4.)) 注意到dot函数只能接受一维tensor torch.dot(x, y)
-
矩阵-向量积
注意到,A的列维数(沿轴1 的长度)必须与向量x的长度相同
A = torch.arange(20, dtype=torch.float32).reshape(5, 4) x = torch.arange(4, dtype=torch.float32) print(A.shape, x.shape, torch.mv(A, x))
result:
(torch.Size([5, 4]), torch.Size([4]), tensor([ 14., 38., 62., 86., 110.]))
-
矩阵乘法
B = torch.ones(4, 3) torch.mm(A, B)
-
L 2 范 数 L_2范数 L2范数 {$}
u = torch.tensor([3.0, -4.0]) torch.norm(u) # norm()函数提供了求L2范数的情况 torch.abs(u).sum() # 简单的求L1范数的情况
u = torch.tensor([3.0, -4.0])
torch.norm(u) # norm()函数提供了求L2范数的情况
torch.abs(u).sum() # 简单的求L1范数的情况