003、线性代数

本文介绍了如何在PyTorch中使用torch库进行线性代数操作,包括标量、向量、矩阵的处理,张量与numpy的互转,浅拷贝与深拷贝,随机数生成和控制,以及基础运算如求和、平均、广播、矩阵乘法、范数计算等,强调这些操作在深度学习中的重要性。
摘要由CSDN通过智能技术生成

之——torch与线代


目录

之——torch与线代

杂谈

正文

1.标量向量

2.元素类型转换

tensor与numpy的互转 

3.拷贝与元素相关

4. 随机数状态

5. 基础运算


杂谈

从数学语言转换为代码,标量、向量、矩阵、多维。主要包括很多新旧东西:

  1. 维度压缩
  2. 均值
  3. 广播计算
  4. 累加求和
  5. 向量乘法
  6. 矩阵乘法
  7. 范数

Torch提供了强大的线性代数操作,用于处理张量(Tensors)。下面是一些Torch中的线性代数基础:

  1. 张量(Tensors):在Torch中,所有数据都表示为张量,它是多维数组的扩展。张量可以包含标量、向量、矩阵以及更高维的数据。你可以使用torch.Tensor来创建张量,也可以使用其他方法如torch.zerostorch.ones等创建特定类型的张量。

  2. 张量操作:Torch提供了各种张量操作,包括加法、减法、乘法、除法、矩阵乘法、转置、索引等。这些操作允许你在张量上执行各种线性代数运算。

  3. 矩阵乘法:在深度学习中,矩阵乘法是一个常见的操作。你可以使用torch.mm或者torch.matmul来执行矩阵乘法操作。例如,torch.mm(A, B)将计算矩阵A和B的乘积。

  4. 转置:你可以使用.T来获取张量的转置,或使用torch.transpose函数来执行更通用的转置操作。

  5. 逆矩阵和伪逆矩阵:Torch提供了torch.inverse函数来计算矩阵的逆矩阵,以及torch.pinverse函数来计算矩阵的伪逆矩阵。

  6. 特征值和特征向量:你可以使用torch.eig函数来计算矩阵的特征值和特征向量。

  7. 奇异值分解(SVD):奇异值分解是另一个常见的线性代数操作,可以使用torch.svd函数来执行。

  8. 解线性方程组:你可以使用torch.solve来解线性方程组Ax = b,其中A是系数矩阵,b是右侧向量。

  9. 范数计算:Torch提供了torch.norm函数来计算张量的范数,包括L1范数、L2范数等。

  10. 其他操作: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("无环计算图,操作子的集合变成计算图")




Course, SC三个表的笛卡尔积。 回答: 对于第一个问题,可以使用以下T-SQL语句: ``` CREATE DATABASE TEST; USE TEST; -- 创建Student表 CREATE TABLE Student ( Sno VARCHAR(10) PRIMARY KEY, Sname VARCHAR(20), Ssex CHAR(2), Sage INT, Sdept VARCHAR(20) ); -- 创建Course表 CREATE TABLE Course ( Cno VARCHAR(10) PRIMARY KEY, Cname VARCHAR(20), Cpno VARCHAR(10), Ccredit INT ); -- 创建SC表 CREATE TABLE SC ( Sno VARCHAR(10), Cno VARCHAR(10), Grade INT, PRIMARY KEY (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno) ); -- 插入样例数据 INSERT INTO Student VALUES ('01', '张三', '男', 20, '计算机系'); INSERT INTO Student VALUES ('02', '李四', '女', 19, '计算机系'); INSERT INTO Student VALUES ('03', '王五', '男', 21, '电子系'); INSERT INTO Course VALUES ('001', '高等数学', NULL, 4); INSERT INTO Course VALUES ('002', '线性代数', NULL, 4); INSERT INTO Course VALUES ('003', '数据库系统概论', NULL, 3); INSERT INTO Course VALUES ('004', '计算机组成原理', NULL, 3); INSERT INTO Course VALUES ('005', '计算机网络', '004', 3); INSERT INTO SC VALUES ('01', '001', 80); INSERT INTO SC VALUES ('01', '002', 85); INSERT INTO SC VALUES ('01', '003', 90); INSERT INTO SC VALUES ('02', '001', 75); INSERT INTO SC VALUES ('02', '002', 82); INSERT INTO SC VALUES ('02', '003', 87); INSERT INTO SC VALUES ('03', '001', 88); INSERT INTO SC VALUES ('03', '002', 90); INSERT INTO SC VALUES ('03', '003', 95); -- 检索《数据库系统概论》课程所有学生的成绩 SELECT Sno, Grade FROM SC WHERE Cno = '003'; -- 检索所有选修了‘003’号课程所有学生的名字 SELECT Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno = '003'); -- 检索‘张三’的《数据库系统概论》课程的成绩 SELECT Grade FROM SC WHERE Sno = '01' AND Cno = '003'; -- 检索选修了三门以上课程的学生学号 SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) >= 3; -- 求Student, Course, SC三个表的笛卡尔积 SELECT * FROM Student, Course, SC; ``` 注:以上代码在SQL Server中测试通过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Here-We-Are

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值