P1 线性代数
P2 线性代数实现
课程代码对应Judpyter笔记本中的位置:d2l-zh/pytorch/chapter_preliminaries/linear-algebra.ipynb
练习:
- 证明一个矩阵𝐀的转置的转置是𝐀:(𝐀⊤)⊤=𝐀。
A = torch.arange(6).reshape(2,3)
A.T.T==A
tensor([[True, True, True],
[True, True, True]])
- 出两个矩阵𝐀和𝐁,显示转置的和等于和的转置:𝐀⊤+𝐁⊤=(𝐀+𝐁)⊤。
A = torch.arange(6).reshape(2,3)
B = torch.ones(6).reshape(2,3)
A.T+B.T==(A+B).T
tensor([[True, True],
[True, True],
[True, True]])
- 给定任意方矩阵𝐀,𝐀+𝐀⊤总是对称的吗?为什么?
A = torch.arange(9).reshape(3,3)
(A+A.T).T==A+A.Ttensor([[True, True],
[True, True],
[True, True]])
(A+A.T).T=A.T+(A.T).T=A.T+A
- 我们在本节中定义了形状(2,3,4)的张量
X
。len(X)
的输出结果是什么? - 对于任意形状的张量
X
,len(X)
是否总是对应于X
特定轴的长度?这个轴是什么?
X = torch.arange(24).reshape(4,3,2)
Y = torch.arange(24).reshape(2,3,4)
Z = torch.arange(24).reshape(3,2,4)
Q =torch.arange(12).reshape(3,4)
T =torch.arange(12).reshape(1,2,3,2)
len(X),len(Y),len(Z),len(Q),len(T)
(4, 2, 3, 3, 1)
看上去是的,都是第0轴。
- 运行
A/A.sum(axis=1)
,看看会发生什么。你能分析原因吗?
A = torch.arange(12, dtype=torch.float32).reshape(3,4)
A/A.sum(axis=1)
RuntimeError Traceback (most recent call last)
<ipython-input-58-06a10640a6fa> in <module>
1 A = torch.arange(12, dtype=torch.float32).reshape(3,4)
2
----> 3 A/A.sum(axis=1)
RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 1
A.sum(axis=1)把列降维,结果为tensor([ 6., 22., 38.]),不能和列数为4的矩阵进行运算(方阵时候可以)
- 当你在曼哈顿的两点之间旅行时,你需要在坐标上走多远,也就是说,就大街和街道而言?你能斜着走吗?
首先去不了曼哈顿。街道中两点坐标距离不能斜着走,走的是一范数吧
- 考虑一个具有形状(2,3,4)的张量,在轴0,1,2上的求和输出是什么形状?
A = torch.arange(24).reshape(2,3,4)
A_sum_axis0 = A.sum(axis=0)
A_sum_axis1 = A.sum(axis=1)
A_sum_axis2 = A.sum(axis=2)
A,A_sum_axis0,A_sum_axis1,A_sum_axis2
(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]]]),
tensor([[12, 14, 16, 18],
[20, 22, 24, 26],
[28, 30, 32, 34]]),
tensor([[12, 15, 18, 21],
[48, 51, 54, 57]]),
tensor([[ 6, 22, 38],
[54, 70, 86]]))
- 向
linalg.norm
函数提供3个或更多轴的张量,并观察其输出。对于任意形状的张量这个函数计算得到什么?
A = torch.arange(6, dtype=torch.float32).reshape(1,2,3)
B = torch.arange(12, dtype=torch.float32).reshape(1,2,3,2)
torch.linalg.norm(A),torch.linalg.norm(B)
(tensor(7.4162), tensor(22.4944))
得到的是矩阵的弗罗贝尼乌斯范数(Frobenius norm),即矩阵元素平方和的平方根
linalg.norm函数求范数参考链接:numpy.linalg.norm(求范数) - 理想几岁 - 博客园
P3 按特定轴求和
默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。 我们还可以[指定张量沿哪一个轴来通过求和降低维度]。以矩阵为例,为了通过求和所有行的元素来降维(轴0),我们可以在调用函数时指定axis=0
。 由于输入矩阵沿0轴降维以生成输出向量,因此输入的轴0的维数在输出形状中丢失。