欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 李沐动手深度学习(pycharm中运行笔记)——05.线性代数

李沐动手深度学习(pycharm中运行笔记)——05.线性代数

2025/5/5 2:50:33 来源:https://blog.csdn.net/qq_54556560/article/details/147513045  浏览:    关键词:李沐动手深度学习(pycharm中运行笔记)——05.线性代数

05.线性代数(与课程对应)

1、导入torch

import torch

2、 标量由只有一个元素的张量表示

x = torch.tensor([3.0])
y = torch.tensor([2.0])
print("x + y:", x + y, "\nx * y:", x * y, "\nx / y:", x / y, "\nx ** y:", x ** y)

运行结果:

3、向量:可以视为标量值组成的列表

a = torch.arange(4)  # (1)创建一个向量
print("a:", a)
print("a[3]:", a[3])  # (2)通过张量的索引来访问任一元素
print("len(a):", len(a))  # (3)访问张量的长度
print("a.shape:", a.shape)  # (4)只有一个轴的张量,形状只有一个元素

运行结果:

4、矩阵

A = torch.arange(20).reshape(5, 4)  # (1)通过指定两个分量m和n来创建一个形状为mxn的矩阵
print("A:", A)
print("A.T:", A.T)  # (2)矩阵的转置

运行结果:

5、对称矩阵:A = A.T

B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
print("B:", B)
print("B == B.T:", B == B.T)  # 所有元素都为True

运行结果:

6、给定具有相同形状的任何两个张量,任何元素二元运算的结果都将是相同形状的张量

C = torch.arange(20, dtype=torch.float32).reshape(5, 4)
D = C.clone()  # 通过分配新内存,将C的一个副本分配给D,这样B与A就没有关系了
print("C:", C, "\nC + D:", C + D)

运行结果: 

7、两个矩阵的按元素乘法称为 哈达玛积

print("C * D:", C * D)

运行结果:

8、张量与标量之间的运算,乘法为例

e = 2
F = torch.arange(24).reshape(2, 3, 4)
print("e + F:", e + F, "\n(e * F).shape:", (e * F).shape)

 运行结果:

9、计算其元素的和

k = torch.arange(4, dtype=torch.float32)
print("k:", k, "\nk.sum():", k.sum())

运行结果:

10、表示任意形状张量的元素和

H = torch.arange(20*2).reshape(2, 5, 4)
print("H:", H, "\nH.shape:", H.shape, "\nH.sum():", H.sum())

运行结果:

11、指定求和汇总张量的轴;按哪个轴求和,这个轴的维数就会消失(对哪一维求和就是消除哪一维)

H_sum_axis0 = H.sum(axis=0)  # (1)对第1个维度进行了求和,两外两个维度留下来了
print("H_sum_axis0:", H_sum_axis0, "\nH_sum_axis0.shape:", H_sum_axis0.shape)
H_sum_axis1 = H.sum(axis=1)  # (2)对第2个维度进行了求和,两外两个维度留下来了
print("H_sum_axis1:", H_sum_axis1, "\nH_sum_axis1.shape:", H_sum_axis1.shape)
H_sum_axis2 = H.sum(axis=2)  # (3)对第3个维度进行了求和,两外两个维度留下来了
print("H_sum_axis2:", H_sum_axis2, "\nH_sum_axis2.shape:", H_sum_axis2.shape)

运行结果:

12、一个与求和相关的量 平均值(mean 或 average)

M = torch.arange(20, dtype=torch.float32).reshape(5, 4)
print("M.mean():", M.mean(), "\nM.sum() / M.numel():", M.sum() / M.numel())  # (1)整体求均值
print("M.mean(axis=0):", M.mean(axis=0), "\nM.sum(axis=0) / M.shape[0]:", M.sum(axis=0) / M.shape[0])  # (2)按轴求均值

运行结果:

13、计算总和或均值时保持轴数不变

sum_M = A.sum(axis=1, keepdims=True)
print("M:", M, "\nsum_M:", sum_M)

运行结果:

14、通过广播将 M 除以 sum_M

print(M / sum_M)

运行结果:

15、某个轴计算 M 元素的累积总和

print("M.cumsum(axis=0):", M.cumsum(axis=0))  # 每行累加做和

运行结果:

16、点积是相同位置的按元素乘积的和

u = torch.arange(4, dtype=torch.float32)
v = torch.ones(4, dtype=torch.float32)
print("u:", u, "\nv:", v, "\ntorch.dot(u, v):", torch.dot(u, v))

运行结果:

17、可以通过执行按元素乘法,然后进行求和来表示两个向量的点积

print("torch.sum(u * v):", torch.sum(u * v))

运行结果:

18、矩阵向量积 Ax 是一个长度为m的列向量,其每个元素是点积

print("M.shape:", M.shape, "\nx.shape:", u.shape, "\ntorch.mv(M, u):", torch.mv(M, u))

运行结果:

19、矩阵与矩阵乘法 MN可以看作是简单地执行m次矩阵向量积,并将结果拼接在一起,形成一个nxm矩阵

N = torch.ones(4, 3)
print("torch.mm(M, N):", torch.mm(M, N))

运行结果:

20、范数:L1、L2范数用于向量;F范数用于矩阵

w = torch.tensor([3.0, -4.0])
print("torch.norm(w):", torch.norm(w))  # (1)L2范数:norm()所有元素平方求和再开根号;向量元素平方和的平方根
print("torch.abs(w).sum():", torch.abs(w).sum())  # L1范数:所有元素的绝对值求和;向量元素的绝对值之和
print("torch.norm(torch.ones((4, 9))):", torch.norm(torch.ones((4, 9))))  # F范数,矩阵的 佛罗贝尼乌斯范数(Frobenius norm)是矩阵元素的平方和的平方根;直接通过norm()就可以得到F范数

运行结果:

21、完整代码:

import torch# 1、标量由只有一个元素的张量表示
x = torch.tensor([3.0])
y = torch.tensor([2.0])
print("x + y:", x + y, "\nx * y:", x * y, "\nx / y:", x / y, "\nx ** y:", x ** y)# 2、向量:可以视为标量值组成的列表
a = torch.arange(4)  # (1)创建一个向量
print("a:", a)
print("a[3]:", a[3])  # (2)通过张量的索引来访问任一元素
print("len(a):", len(a))  # (3)访问张量的长度
print("a.shape:", a.shape)  # (4)只有一个轴的张量,形状只有一个元素# 3、矩阵
A = torch.arange(20).reshape(5, 4)  # (1)通过指定两个分量m和n来创建一个形状为mxn的矩阵
print("A:", A)
print("A.T:", A.T)  # (2)矩阵的转置# 4、对称矩阵:A = A.T
B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
print("B:", B)
print("B == B.T:", B == B.T)  # 所有元素都为True# 5、就像向量是标量的推广,矩阵是向量的推广,我们可以构建具有更多轴的数据结构
X = torch.arange(24).reshape(2, 3, 4)
print("X:", X)# 6、给定具有相同形状的任何两个张量,任何元素二元运算的结果都将是相同形状的张量
C = torch.arange(20, dtype=torch.float32).reshape(5, 4)
D = C.clone()  # 通过分配新内存,将C的一个副本分配给D,这样B与A就没有关系了
print("C:", C, "\nC + D:", C + D)# 7、两个矩阵的按元素乘法称为 哈达玛积
print("C * D:", C * D)# 8、张量与标量之间的运算,乘法为例
e = 2
F = torch.arange(24).reshape(2, 3, 4)
print("e + F:", e + F, "\n(e * F).shape:", (e * F).shape)# 9、计算其元素的和
k = torch.arange(4, dtype=torch.float32)
print("k:", k, "\nk.sum():", k.sum())# 10、表示任意形状张量的元素和
H = torch.arange(20*2).reshape(2, 5, 4)
print("H:", H, "\nH.shape:", H.shape, "\nH.sum():", H.sum())# 11、指定求和汇总张量的轴;按哪个轴求和,这个轴的维数就会消失(对哪一维求和就是消除哪一维)
H_sum_axis0 = H.sum(axis=0)  # (1)对第1个维度进行了求和,两外两个维度留下来了
print("H_sum_axis0:", H_sum_axis0, "\nH_sum_axis0.shape:", H_sum_axis0.shape)
H_sum_axis1 = H.sum(axis=1)  # (2)对第2个维度进行了求和,两外两个维度留下来了
print("H_sum_axis1:", H_sum_axis1, "\nH_sum_axis1.shape:", H_sum_axis1.shape)
H_sum_axis2 = H.sum(axis=2)  # (3)对第3个维度进行了求和,两外两个维度留下来了
print("H_sum_axis2:", H_sum_axis2, "\nH_sum_axis2.shape:", H_sum_axis2.shape)# 12、一个与求和相关的量 平均值(mean 或 average)
M = torch.arange(20, dtype=torch.float32).reshape(5, 4)
print("M.mean():", M.mean(), "\nM.sum() / M.numel():", M.sum() / M.numel())  # (1)整体求均值
print("M.mean(axis=0):", M.mean(axis=0), "\nM.sum(axis=0) / M.shape[0]:", M.sum(axis=0) / M.shape[0])  # (2)按轴求均值# 13、计算总和或均值时保持轴数不变
sum_M = A.sum(axis=1, keepdims=True)
print("M:", M, "\nsum_M:", sum_M)# 14、通过广播将 M 除以 sum_M
print("M / sum_M:", M / sum_M)# 15、某个轴计算 M 元素的累积总和
print("M.cumsum(axis=0):", M.cumsum(axis=0))  # 每行累加做和# 16、点积是相同位置的按元素乘积的和
u = torch.arange(4, dtype=torch.float32)
v = torch.ones(4, dtype=torch.float32)
print("u:", u, "\nv:", v, "\ntorch.dot(u, v):", torch.dot(u, v))# 17、可以通过执行按元素乘法,然后进行求和来表示两个向量的点积
print("torch.sum(u * v):", torch.sum(u * v))# 18、矩阵向量积 Ax 是一个长度为m的列向量,其每个元素是点积
print("M.shape:", M.shape, "\nx.shape:", u.shape, "\ntorch.mv(M, u):", torch.mv(M, u))# 19、矩阵与矩阵乘法 MN可以看作是简单地执行m次矩阵向量积,并将结果拼接在一起,形成一个nxm矩阵
N = torch.ones(4, 3)
print("torch.mm(M, N):", torch.mm(M, N))# 20、范数:L1、L2范数用于向量;F范数用于矩阵
w = torch.tensor([3.0, -4.0])
print("torch.norm(w):", torch.norm(w))  # (1)L2范数:norm()所有元素平方求和再开根号;向量元素平方和的平方根
print("torch.abs(w).sum():", torch.abs(w).sum())  # L1范数:所有元素的绝对值求和;向量元素的绝对值之和
print("torch.norm(torch.ones((4, 9))):", torch.norm(torch.ones((4, 9))))  # F范数,矩阵的 佛罗贝尼乌斯范数(Frobenius norm)是矩阵元素的平方和的平方根;直接通过norm()就可以得到F范数

 如果此文章对您有所帮助,那就请点个赞吧,收藏+关注 那就更棒啦,十分感谢!!! 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词