#pytorch笔记
以后打算用CSDN作为记笔记的地方,去年9月份本来就有这样的想法,后来因为种种原因搁置了。现在还存着去年的草稿。
对于张量降维度
a=torch.arange(24).reshape(2,3,4)
Out[24]:
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]]])
a是个三阶张量/ 三维张量
a.sum(dim=0/1/2)这里,dim(axis)=0表示,对0维度的进行相加也就是说把这一维消除/这一维度相加。
默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。 我们还可以指定张量沿哪一个轴来通过求和降低维度。 以矩阵为例,为了通过求和所有行的元素来降维(轴0),可以在调用函数时指定axis=0
。 由于输入矩阵沿0轴降维以生成输出向量,因此输入轴0的维数在输出形状中消失。
如果想要对n阶张量进行所有元素求和,直接a.sum()即可。
当然,如果想要不断分层求和也可以:
A.sum(axis=[0, 1]) # 结果和A.sum()相同
一个与求和相关的量是平均值(mean或average)。 我们通过将总和除以元素总数来计算平均值。 在代码中,我们可以调用函数来计算任意形状张量的平均值。
A.mean(), A.sum() / A.numel()
我在尝试中发现a.mean()会报错,后者用总和除以元素总数是没问题的。
RuntimeError: mean(): could not infer output dtype. Input dtype must be either a floating point or complex dtype. Got: Long
同理用平均值进行将降维度,对第一阶(维)的张量进行均值降维
a.sum(axis=0) / a.shape[0]
Out[34]:
tensor([[ 6., 7., 8., 9.],
[10., 11., 12., 13.],
[14., 15., 16., 17.]])
非降维求和,保持了初始的维度。#keepdims=True
a.sum(dim=2,keepdims=True)
Out[39]:
tensor([[[ 6],
[22],
[38]],
[[54],
[70],
[86]]])
如果我们想沿某个轴计算A
元素的累积总和, 比如axis=0
(按行计算),可以调用cumsum
函数。 此函数不会沿任何轴降低
a
Out[42]:
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]]])
a.cumsum(axis=0)
Out[43]:
tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 14, 16, 18],
[20, 22, 24, 26],
[28, 30, 32, 34]]])
输入张量的维度。
在代码中使用张量表示矩阵-向量积,我们使用mv
函数。 当我们为矩阵A
和向量x
调用torch.mv(A, x)
时,会执行矩阵-向量积。 注意,A
的列维数(沿轴1的长度)必须与x
的维数(其长度)相同
A
Out[3]:
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
x
Out[4]: tensor([0, 1, 2, 3])
torch.mv(A, x)
Out[5]: tensor([ 14, 38, 62, 86, 110])
另外自己在做的时候发现,这里做矩阵向量乘时,必须要求m和x都是相同的格式,要么都是浮点型,要么都是整型。
torch.mm(A,B)
Out[2]:
tensor([[ 6, 6, 6],
[22, 22, 22],
[38, 38, 38],
[54, 54, 54],
[70, 70, 70]])
这里
可以A=torch.arange(20,dtype=float).reshape(5,4)它转成浮点型这样 数值格式一致不会发生报错。
要记住Hadamard积别和矩阵乘法搞混。
2范数:
u = torch.tensor([3.0, -4.0])
torch.norm(u)
tensor(5.)
1范数
torch.abs(u).sum()
tensor(7.)
p范数和Frobenius范数
torch.norm(torch.ones((4, 9)))
tensor(6.)
在深度学习中,我们经常试图解决优化问题: 最大化分配给观测数据的概率; 最小化预测和真实观测之间的距离。 用向量表示物品(如单词、产品或新闻文章),以便最小化相似项目之间的距离,最大化不同项目之间的距离。 目标,或许是深度学习算法最重要的组成部分(除了数据),通常被表达为范数。
仅用一节,我们就教会了阅读本书所需的、用以理解现代深度学习的线性代数。 线性代数还有很多,其中很多数学对于机器学习非常有用。 例如,矩阵可以分解为因子,这些分解可以显示真实世界数据集中的低维结构。 机器学习的整个子领域都侧重于使用矩阵分解及其向高阶张量的泛化,来发现数据集中的结构并解决预测问题。 当开始动手尝试并在真实数据集上应用了有效的机器学习模型,你会更倾向于学习更多数学。 因此,这一节到此结束,本书将在后面介绍更多数学知识。
如果渴望了解有关线性代数的更多信息,可以参考线性代数运算的在线附录或其他优秀资源 (Kolter, 2008, Petersen et al., 2008, Strang, 1993)。