介绍:
深度学习是一种机器学习的方法,涉及到大量的线性代数运算。线性代数是研究向量空间和线性映射的数学学科。在深度学习中,线性代数常用于表示和处理输入数据和模型参数。下面是一些深度学习中常见的线性代数概念和运算:
1. 向量:在深度学习中,向量是一种表示数据的结构。它可以表示输入数据、模型参数和梯度等。向量通常用列向量表示,形如x = [x1, x2, ..., xn]。向量之间可以进行加法、减法和标量乘法等运算。
2. 矩阵:矩阵是一个二维的数组,通常用于表示线性映射。在深度学习中,矩阵用于表示输入数据和模型的权重。矩阵乘法是深度学习中最常用的运算之一,用于实现神经网络的前向传播和反向传播。
3. 转置:矩阵的转置是将矩阵的行和列互换得到的新矩阵。在深度学习中,转置常常用于计算梯度和调整矩阵的形状。
4. 矩阵的逆:一个可逆矩阵的逆矩阵是使得矩阵与其逆矩阵相乘等于单位矩阵的矩阵。在深度学习中,矩阵的逆常用于求解线性方程组和计算梯度。
5. 行列式:行列式是一个与矩阵相关的标量值。在深度学习中,行列式被用于判断矩阵是否可逆,从而决定是否能够求解线性方程组。
6. 特征值和特征向量:特征值和特征向量是矩阵运算中的重要概念。特征值表示线性映射中的缩放比例,特征向量表示变换后的方向。在深度学习中,特征值和特征向量常用于降维和分析模型的性质。
以上是深度学习中常见的线性代数概念和运算。深入理解线性代数对于掌握深度学习的原理和实践非常重要。
1、标量与变量
import torch
print('1.标量与变量')
x = torch.tensor([3.0])
y = torch.tensor([2.0])
print(x + y, x * y, x / y, x ** y)
2、向量
x = torch.arange(4)
print('2.向量')
print('x:', x)
print('x[3]:', x[3]) # 通过张量的索引来访问任一元素
print('张量的形状:', x.shape) # 张量的形状
print('张量的长度:', len(x)) # 张量的长度
z = torch.arange(24).reshape(2, 3, 4)
print('三维张量的长度:', len(z))
3、矩阵
print('3.矩阵')
A = torch.arange(20).reshape(5, 4)
print('A:', A)
print('A.shape:', A.shape)
print('A.shape[-1]:', A.shape[-1])
print('A.T:', A.T) # 矩阵的转置
B=torch.tensor([[1,2,3],[2,0,4],[3,4,5]])#对称矩阵
B==B.T
4、矩阵计算
print('4.矩阵的计算')
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A#内存一样,不会改变
B = A.clone() # 通过分配新内存,将A的一个副本分配给B
print('A:', A)
print('B:', B)
print('A + B:', A + B) # 矩阵相加
print('A * B:', A * B) # 矩阵相乘
a = 2
X = torch.arange(24).reshape(2, 3, 4)
print('X:', X)
print('a + X:', a + X) # 矩阵的值加上标量
print('a * X:', a * X)
print((a * X).shape)
5、矩阵的sum运算
print('5.矩阵的sum运算')
print('A:', A)
print('A.shape:', A.shape)
print('A.sum():', A.sum())
print('A.sum(axis=0):', A.sum(axis=0)) # 沿0轴汇总以生成输出向量
print('A.sum(axis=1):', A.sum(axis=1)) # 沿1轴汇总以生成输出向量
print('A.sum(axis=1, keepdims=True)', A.sum(axis=1, keepdims=True)) # 计算总和保持轴数不变
print('A.sum(axis=[0, 1]):', A.sum(axis=[0, 1])) # Same as `A.sum()`
print('A.mean():', A.mean())
print('A.sum() / A.numel():', A.sum() / A.numel())
a=torch.ones((2,5,4))
a.shape
#结果:torch.Size([2, 5, 4])
a.sum(axis=1).shape#把中间那一维给丢掉了
#结果:torch.Size([2, 4])
a.sum(axis=1,keepdims=True).shape#保留了中间那一维
#结果:torch.Size([2, 1, 4])
sum_A=A.sum(axis=1,keepdims=True)#计算总和或均值时保持轴数不变
print('sum_A:',sum_A)
print('通过广播将A除以sum_A:\n',A/sum_A)
6、向量相乘(点积)
print('6.向量-向量相乘(点积)')
x = torch.arange(4, dtype=torch.float32)
y = torch.ones(4, dtype=torch.float32)
print('x:', x)
print('y:', y)
print('向量-向量点积:', torch.dot(x, y))#对应的相乘再相加
7、矩阵向量乘积(向量积)
print('7.矩阵-向量相乘(向量积)')
print('A:', A) # 5*4维
print('x:', x) # 4*1维
print('torch.mv(A, x):', torch.mv(A, x))
8、矩阵相乘(向量积)
print('8.矩阵-矩阵相乘(向量积)')
print('A:', A) # 5*4维
B = torch.ones(4, 3) # 4*3维
print('B:', B)
print('torch.mm(A, B):', torch.mm(A, B))
9、范数
print('9.范数')#向量或者矩阵的长度
u = torch.tensor([3.0, -4.0])
print('向量的𝐿2范数:', torch.norm(u)) # 向量的𝐿2范数
print('向量的𝐿1范数:', torch.abs(u).sum()) # 向量的𝐿1范数
v = torch.ones((4, 9))
print('v:', v)
print('矩阵的𝐿2范数:', torch.norm(v)) # 矩阵的𝐿2范数
10、根据索引访问矩阵
print('10.根据索引访问矩阵')
y = torch.arange(10).reshape(5, 2)
print('y:', y)
index = torch.tensor([1, 4])
print('y[index]:', y[index])