之——torch与线代
目录
杂谈
从数学语言转换为代码,标量、向量、矩阵、多维。主要包括很多新旧东西:
- 维度压缩
- 均值
- 广播计算
- 累加求和
- 向量乘法
- 矩阵乘法
- 范数
Torch提供了强大的线性代数操作,用于处理张量(Tensors)。下面是一些Torch中的线性代数基础:
张量(Tensors):在Torch中,所有数据都表示为张量,它是多维数组的扩展。张量可以包含标量、向量、矩阵以及更高维的数据。你可以使用
torch.Tensor
来创建张量,也可以使用其他方法如torch.zeros
、torch.ones
等创建特定类型的张量。张量操作:Torch提供了各种张量操作,包括加法、减法、乘法、除法、矩阵乘法、转置、索引等。这些操作允许你在张量上执行各种线性代数运算。
矩阵乘法:在深度学习中,矩阵乘法是一个常见的操作。你可以使用
torch.mm
或者torch.matmul
来执行矩阵乘法操作。例如,torch.mm(A, B)
将计算矩阵A和B的乘积。转置:你可以使用
.T
来获取张量的转置,或使用torch.transpose
函数来执行更通用的转置操作。逆矩阵和伪逆矩阵:Torch提供了
torch.inverse
函数来计算矩阵的逆矩阵,以及torch.pinverse
函数来计算矩阵的伪逆矩阵。特征值和特征向量:你可以使用
torch.eig
函数来计算矩阵的特征值和特征向量。奇异值分解(SVD):奇异值分解是另一个常见的线性代数操作,可以使用
torch.svd
函数来执行。解线性方程组:你可以使用
torch.solve
来解线性方程组Ax = b,其中A是系数矩阵,b是右侧向量。范数计算:Torch提供了
torch.norm
函数来计算张量的范数,包括L1范数、L2范数等。其他操作:Torch还支持一系列其他线性代数操作,如矩阵分解、行列式计算、迹运算等。
在Torch中,线性代数操作非常重要,因为它们在深度学习和机器学习中经常用于参数优化、特征提取、数据处理等任务。熟练掌握这些操作对于进行高效的深度学习研究和开发非常有帮助。
正文
1.标量向量
基础的初始化与查看
#标量
import torch
x = torch.tensor(3.0)
y = torch.tensor(2.0)
print(x + y, x * y, x / y, x**y)
#%%
#向量
x = torch.arange(4)
print(x)
print(x[3])
print(len(x))
print(x.shape)
#%%
A=torch.arange(20).reshape(4,5)
print(A)
print(A.T)
#%%
#个数,行数,列数
B=torch.arange(24).reshape(2,3,4)
print(B)
print(type(B))
print(B.dtype)
print(B[1])
2.元素类型转换
tensor与numpy的互转
#转换元素类型(克隆,不会影响原始)
print(B.dtype)
C=B.type(torch.float)
print(C.dtype)
D=C.type(torch.float32)
print(D.dtype)
E=D.type(torch.float64)
print(E.dtype)
3.拷贝与元素相关
浅拷贝与深拷贝
#%%
#浅层拷贝和深层拷贝,copy
F=torch.zeros(3,4)
E=F
F[:]=2
print(F)
print(E)
#深拷贝分配了新的内存,改变时候不会改变原有内存东西,clone
G=F.clone()
F[:]=1
print(F)
print(G)
4. 随机数状态
可以设定随机数状态
#%%
# 保存当前的随机数生成器状态
rng_state =torch.get_rng_state()
#设置随机数种子
seed_value = 43
torch.manual_seed(seed_value)
a=torch.ones((3,4))
b=torch.randn((3,4))
print(a,b)
#**************************************************按元素对应相乘
print(a*b)
# 恢复随机数生成器状态到之前保存的状态
torch.set_rng_state(rng_state)
c=torch.rand((3,4))
print(c)
5. 基础运算
各种基本运算技巧
#%%
import torch
a=torch.randn((3,4,5))
#运算,加减乘除
#求和
print(a.sum())
#按维度求和
print("按维度求和,维度压缩")
print(a.sum(axis=0))
print(a.sum(axis=1))
#求均值
print("求均值")
print(a.mean())
print(a.sum()/a.numel())
print(a.mean(axis=0))
#不丢掉维度的运算,广播计算就会默认增广为最大的
print("广播计算")
sum_a=a.sum(axis=0,keepdim=True)
print(sum_a)
print(a/sum_a)
print(a/a.sum(axis=0))
#累加求和
b=torch.arange(12).reshape(3,4)
print("累加求和")
print(b)
print(b.cumsum(0))
#%%
#乘法
a=torch.arange(12)
b=torch.arange(0,12)
print(a,b)
print("向量乘法")
print(torch.sum(a*b))
print(torch.dot(a,b))
a=a.reshape(3,4)
b=b.reshape(4,3)
c=torch.arange(4)
print("矩阵向量乘法")
print(a,c)
print(torch.mv(a,c))
print("叉乘,矩阵乘法")
print(torch.mm(a,b))
print("mm只适用于二维矩阵,更高维的矩阵或者说泛化性通用性更强、带广播的的矩阵乘法是matmul")
a=torch.arange(12)
b=torch.arange(0,12)
a=a.reshape(2,2,3)
b=b.reshape(2,3,2)
print(torch.matmul(a,b))
print("范数L2")
print(c)
print(torch.norm(c.float()))
print("F范数")
print(torch.norm(a.float()))
#%%
#按多个维度运算
a=torch.arange(12).reshape(2,3,2)
print(a)
print(a.sum(axis=[0,1]))
#%%
print("矩阵计算,主要在于求导数,矩阵相关导数的前后输入形状")
print("链式法则")
print("自动求导")
print("无环计算图,操作子的集合变成计算图")