” 线性代数 linear algebra 2.3.1 标量#标量由只有一个元素的张量表示 import torch x = torch.tensor(3.0) y = torch.tensor(2.0) x + y, x * y,x / y,x ** y (tensor(5.), tensor(6.), tensor(1.5000), tensor(9.)) 2.3.2 向量#向量可以被视为标量值组成的列表。这些标量值被称为向量的元素(element)或分量(component)。 #人们通过一维张量表示向量。一般来说,张量可以具有任意长度,取决于机器的内存限制。 x = torch.arange(4) x tensor([0, 1, 2, 3]) x[3] tensor(3) 2.3.2.1 长度、维度和形状len() 函数来访问张量的长度。#向量的长度通常称为向量的维度(dimension) len(x) 4 #当用张量表示一个向量(只有一个轴)时,我们也可以通过.shape属性访问向量的长度。 #形状(shape)是一个元素组,列出了张量沿每个轴的长度(维数)。对于只有一个轴的张量,形状只有一个元素。 x.shape torch.Size([4]) 2.3.3 矩阵#正如向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。矩阵,我们通常用粗体、大写字母来表示 X,Y,Z #当调用函数来实例化张量时,我们可以通过指定两个分量m和n来创建一个形状为m*n的矩阵 A = torch.arange(20).reshape(5,4) A tensor([[ 0, 1, 2, 3], #当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose)。 #如果矩阵B等于A的转置,那么对于任何i和j都有bij = aji A.T tensor([[ 0, 4, 8, 12, 16], #作为方阵的一种特殊类型,对称矩阵(symmetric matrix)A等于其转置A.T:。这里定义一个对称矩阵B B = torch.tensor([[1,2,3],[2,0,4],[3,4,5]]) B tensor([[1, 2, 3], B == B.T tensor([[True, True, True], #矩阵是有用的数据结构:它们允许我们组织具有不同模式的数据。 #例如,我们矩阵中的行可能对应于不同的房屋(数据样本),而列可能对应于不同的属性 #尽管单个向量的默认方向是列向量,但在表示表格数据集的矩阵中, 将每个数据样本作为矩阵中的行向量更为常见。 2.3.4 张量#我们开始处理图像时,张量将变得更加重要,图像以维数组形式出现, 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]]]) 2.3.5 张量算法的基本性质A = torch.arange(20,dtype=torch.float32).reshape(5,4) (tensor([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.], [16., 17., 18., 19.]]), tensor([[ 0., 2., 4., 6.], [ 8., 10., 12., 14.], [16., 18., 20., 22.], [24., 26., 28., 30.], [32., 34., 36., 38.]])) #两个矩阵的按元素乘法称为Hadamard积(Hadamard product) tensor([[ 0., 1., 4., 9.], [ 16., 25., 36., 49.], [ 64., 81., 100., 121.], [144., 169., 196., 225.], [256., 289., 324., 361.]]) #将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。 (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([[[ 2, 3, 4, 5], [ 6, 7, 8, 9], [10, 11, 12, 13]], [[14, 15, 16, 17], [18, 19, 20, 21], [22, 23, 24, 25]]]), tensor([[[ 0, 2, 4, 6], [ 8, 10, 12, 14], [16, 18, 20, 22]], [[24, 26, 28, 30], [32, 34, 36, 38], [40, 42, 44, 46]]]), torch.Size([2, 3, 4])) 2.3.6 降维$$ 。在代码中可以调用计算求和的函数: #降维 (tensor([0., 1., 2., 3.]), tensor(6.)) A.shape,A.sum() (torch.Size([5, 4]), tensor(190.)) #默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。 tensor([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.], [16., 17., 18., 19.]]) A_sum_asix0 = A.sum(axis=0) (tensor([40., 45., 50., 55.]), torch.Size([4])) #指定axis=1将通过汇总所有列的元素降维(轴1)。因此,输入轴1的维数在输出形状中消失。 (tensor([ 6., 22., 38., 54., 70.]), torch.Size([5])) #沿着行和列对矩阵求和,等价于对矩阵的所有元素进行求和。 (tensor(190.), tensor(190.), torch.Size([])) #一个与求和相关的量是平均值(mean或average)。我们通过将总和除以元素总数来计算平均值。 (tensor(9.5000), tensor(9.5000)) #同样,计算平均值的函数也可以沿指定轴降低张量的维度。 (tensor([ 8., 9., 10., 11.]), tensor([ 8., 9., 10., 11.])) 2.3.6.1 非降维求和#但是,有时在调用函数来计算总和或均值时保持轴数不变会很有用。 tensor([[ 6.], [22.], [38.], [54.], [70.]]) #例如,由于sum_A在对每行进行求和后仍保持两个轴,我们可以通过广播将A除以sum_A。 (tensor([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.], [16., 17., 18., 19.]]), tensor([[0.0000, 0.1667, 0.3333, 0.5000], [0.1818, 0.2273, 0.2727, 0.3182], [0.2105, 0.2368, 0.2632, 0.2895], [0.2222, 0.2407, 0.2593, 0.2778], [0.2286, 0.2429, 0.2571, 0.2714]])) #如果我们想沿某个轴计算A元素的累积总和, 比如axis=0(按行计算),可以调用cumsum函数。此函数不会沿任何轴降低输入张量的维度。 (tensor([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.], [16., 17., 18., 19.]]), tensor([[ 0., 1., 2., 3.], [ 4., 6., 8., 10.], [12., 15., 18., 21.], [24., 28., 32., 36.], [40., 45., 50., 55.]])) 2.3.7 点积我们已经学习了按元素操作、求和及平均值。另一个最基本的操作之一是点积。给定两个向量x,y∈Rn, 它们的点积(dot product)x⊤y(或⟨x,y⟩) 是相同位置的按元素乘积的和。 注意,我们可以通过执行按元素乘法,然后进行求和来表示两个向量的点积。 #点积在数学中,又称数量积(dot product; scalar product),是指接受在实数R上的两个向量并返回一个实数值标量的二元运算。 (tensor([0., 1., 2., 3.]), tensor([1., 1., 1., 1.]), tensor(6.)) #注意,我们可以通过执行按元素乘法,然后进行求和来表示两个向量的点积: tensor(6.) 2.3.8 矩阵-向量积#在代码中使用张量表示矩阵-向量积,我们使用mv函数。当我们为矩阵A和向量x调用torch.mv(A, x)时,会执行矩阵-向量积。 (tensor([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.], [16., 17., 18., 19.]]), tensor([0., 1., 2., 3.]), torch.Size([5, 4]), torch.Size([4]), tensor([ 14., 38., 62., 86., 110.])) 2.3.9 矩阵-矩阵乘法#矩阵乘法 (tensor([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.], [16., 17., 18., 19.]]), tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.]]), torch.Size([5, 4]), torch.Size([4, 3]), tensor([[ 6., 6., 6.], [22., 22., 22.], [38., 38., 38.], [54., 54., 54.], [70., 70., 70.]])) 2.3.10 范数#线性代数中最有用的一些运算符是范数(norm)。非正式地说,向量的范数是表示一个向量有多大。 tensor(5.) #与L2范数相比,L1范数受异常值的影响较小。为了计算L1范数,我们将绝对值函数和按元素求和组合起来。 tensor(7.) #矩阵范数是矩阵元素平方和的平方根 tensor(6.) 2.3.10.1 范数和目标2.3.11 小结
觉得不错 点个再看吧 |
|