zoukankan      html  css  js  c++  java
  • 05 线性代数

    1 只由一个元素组成的张量称为一维张量

    x=torch.tensor([3.0])
    y=torch.tensor([2.0])
    x+y,x-y,x*y,x/y,x**y
    (tensor([5.]), tensor([1.]), tensor([6.]), tensor([1.5000]), tensor([9.]))

    2 矩阵的转置

    A=torch.arange(20).reshape(5,4)
    A
    tensor([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11],
            [12, 13, 14, 15],
            [16, 17, 18, 19]])
    A.T
    tensor([[ 0,  4,  8, 12, 16],
            [ 1,  5,  9, 13, 17],
            [ 2,  6, 10, 14, 18],
            [ 3,  7, 11, 15, 19]])

    3 拷贝内容到新的内存

    C=A    #这里没有拷贝,只是将A的指针直接给了C
    B=A.clone() #将A的内容拷贝到新的内存给B
    C[:]=1  #改变了A所指的数据
    A,B,C
    (tensor([[1, 1, 1, 1],
             [1, 1, 1, 1],
             [1, 1, 1, 1],
             [1, 1, 1, 1],
             [1, 1, 1, 1]]),
     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],
             [1, 1, 1, 1],
             [1, 1, 1, 1]]))

    4 对矩阵元素求和

    A=torch.arange(40).reshape(2,5,4)
    A
    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],
             [24, 25, 26, 27],
             [28, 29, 30, 31],
             [32, 33, 34, 35],
             [36, 37, 38, 39]]])
    A.shape,A.sum()
    (torch.Size([2, 5, 4]), tensor(780))
    A.sum().shape
    torch.Size([])

    5 按特定轴求和

    A_sum_axis0=A.sum(axis=0)
    A_sum_axis0,A_sum_axis0.shape
    (tensor([[20, 22, 24, 26],
             [28, 30, 32, 34],
             [36, 38, 40, 42],
             [44, 46, 48, 50],
             [52, 54, 56, 58]]),
     torch.Size([5, 4]))

    A是2*5*4,axis=0表示将2这一维度压缩掉,最后变成了5*4,如下图所示

    A_sum_axis1=A.sum(axis=1)
    A_sum_axis1,A_sum_axis1.shape
    (tensor([[ 40,  45,  50,  55],
             [140, 145, 150, 155]]),
     torch.Size([2, 4]))

    axis=1时则变成了2*4

    A_sum_axis2=A.sum(axis=2)
    A_sum_axis2,A_sum_axis2.shape
    (tensor([[  6,  22,  38,  54,  70],
             [ 86, 102, 118, 134, 150]]),
     torch.Size([2, 5]))

    axis=2时则变成了2*5

    可以让keepdims参数变成True来让维度不变----压缩掉的那维变成1-------方便进行广播。

    A_sum_axis0=A.sum(axis=0,keepdims=True)
    A_sum_axis0,A_sum_axis0.shape
    (tensor([[[20, 22, 24, 26],
              [28, 30, 32, 34],
              [36, 38, 40, 42],
              [44, 46, 48, 50],
              [52, 54, 56, 58]]]),
     torch.Size([1, 5, 4]))

    注意可以同时压缩掉两个维度
    A_sum_axis0_1=A.sum(axis=[0,1],keepdims=True)
    A_sum_axis0_1,A_sum_axis0_1.shape
    (tensor([[[180, 190, 200, 210]]]), torch.Size([1, 1, 4]))

    6 向量的点积和

      这里表示相同位置元素乘积之和,不同数据类型不能进行点积运算,dot也只能进行一维向量的点积。

    x=torch.arange(4,dtype=torch.float32)
    y=torch.ones(4,dtype=torch.float32)
    torch.dot(x,y)
    tensor(6.)

    print(x*y)  #元素乘法
    sum(x*y)
    tensor([0., 1., 2., 3.])
    tensor(6.)

    7 torch.mv()

      表示矩阵(二维)与向量(一维)之间的乘积,且数据类型必须相同

    K=torch.tensor([[ 0.0,  1,  2,  3],
             [ 4,  5,  6,  7],
             [ 8,  9, 10, 11],
             [12, 13, 14, 15],
             [16, 17, 18, 19]])
    K.shape,x.shape,torch.mv(K,x)
    (torch.Size([5, 4]), torch.Size([4]), tensor([ 14.,  38.,  62.,  86., 110.]))

    8 torch.mm()

      表示矩阵(二维)与矩阵(二维)之间的乘积,且数据类型必须相同

    9 范数

      范数表示矩阵或者向量的长度。

    (1) L2范数

        

          L2范数   主要是针对向量的

    u=torch.tensor([3.0,-4.0])
    torch.norm(u)
    tensor(5.)
    (2)L1范数
    表示元素绝对值的和
    torch.abs(u).sum()
    tensor(7.)
    (3)弗罗贝尼乌斯范数( [公式] )
    这是针对矩阵的,表示矩阵元素和的平方值开方,与L2范数类似
    Z=torch.ones(4,9)
    torch.norm(Z)
    
    
    tensor(6.)
  • 相关阅读:
    leetcode74
    leetcode59
    leetcode1283
    0079. Word Search (M)
    0067. Add Binary (E)
    0203. Remove Linked List Elements (E)
    用async 解放你的大脑
    Python 类属性和方法
    Python 类装饰器
    Python 装饰器
  • 原文地址:https://www.cnblogs.com/flyljz/p/15736478.html
Copyright © 2011-2022 走看看