轴的概念——跟着李沐学AI课程笔记(补充)

如何理解torch/numpy求和函数sum中的axis参数
用行和列的概念对于更高维度的张量/数组可能不好理解,因此引入“轴”的概念:

轴:就是每个张量的维度数的长度
例如:

  • 一个向量[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],其形状为torch.Size([12])),则12代表一个轴,为轴0
  • 一个矩阵[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]],其形状为torch.Size([3, 4])),则3代表一个轴,为轴0,4代表一个轴,为轴1
  • 以此类推,更高维度的张量可能有轴2轴3的概念。

则调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。 axis的实质就是指定张量沿哪一个轴来通过求和降低维度。

下面看测试代码:

import torch
A = torch.arange(12)
A,A.shape

输出一个12元素的向量,其shape可以理解为(12),12为轴0
(tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]))
然后对其求和:
A_axis_0 = A.sum(axis=0)输出tensor(66)其shape变成(1),轴0被指定求和了;

(指定axis=1时求和时将会出现报错:IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1),意思为超过维度求和,因为A是一个向量,轴只有一个即12。)

构建一个矩阵:

B = torch.arange(12).reshape(3,-1)
B,B.shape

输出一个12个元素的矩阵,其shape为(3x4),3为轴
0,4为轴1

(tensor([[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]]),
 torch.Size([3, 4]))

指定axis=0求和B_axis_0 = B.sum(axis=0)

输出一个4元素向量其shape为(4),轴0被指定求和了
(tensor([12, 15, 18, 21])

指定axis=1求和B_axis_1 = B.sum(axis=1)

输出一个3元素向量其shape为(3),轴1被指定求和了

tensor([ 6, 22, 38]))

构建一个复杂的矩阵:

C = torch.arange(24).reshape(2,3,4)
C,C.shape

输出一个24个元素的矩阵,其shape为(2x3x4),同理轴0为2、轴1为3、轴2为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]]]),
 torch.Size([2, 3, 4]))

指定axis=0求和C_axis_0 = C.sum(axis=0)

输出一个12个元素的矩阵,其shape为(3x4),轴0被指定求和了

tensor([[12, 14, 16, 18],
        [20, 22, 24, 26],
        [28, 30, 32, 34]])

指定axis=1求和C_axis_1 = C.sum(axis=1)

输出一个8个元素的矩阵,其shape为(2x4),轴1被指定求和了

 tensor([[12, 15, 18, 21],
         [48, 51, 54, 57]])

指定axis=2求和C_axis_2 = C.sum(axis=2)

输出一个6个元素的矩阵,其shape为(2x3),轴2被指定求和了

 tensor([[ 6, 22, 38],
         [54, 70, 86]])

更高维度的张量可以以此类推。因此指定axis等于几就是指定对第几个轴求和。

再回到二维矩阵,则轴0就代表行,轴1代表列,则对轴0求和就是将行合并成一行,列数不变;对轴1求和就是将列合并成成一列,行数不变,具体运算过程需要自己下去实验实验才行。

猜你喜欢

转载自blog.csdn.net/p3116002589/article/details/117420557