2021-09-14

python常见知识点总结

  1. position = torch.arange(0, 100, 2, dtype=torch.float)
    print(position)
    
    # torch.arange(起点(含,省略0开始), 终点(不含), 间隔数(省略为1), dtype=torch.float)
    =========================================================================
    >>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., 48., 50., 52., 54.,
    56., 58., 60., 62., 64., 66., 68., 70., 72., 74., 76., 78., 80., 82., 84., 86., 88., 90., 92., 94., 96., 98.])
    
  2. # 插入一个维度
    tensor.unsqueeze(插入后的维度,省略默认在最后一个维度)
    # 删除一个维度
    tensor.unsqueeze(要删除的维度,省略默认为维度为1的那个维度)
    
    =========================================================================
    position = torch.arange(100, dtype=torch.float)
    a = position.unsqueeze(1)
    b = a.squeeze()
    print(position.size(),a.size(),b.size())
    
    =========================================================================
    >>torch.Size([100]) torch.Size([100, 1]) torch.Size([100])
    
  3. math.log(x[, base])
    # x -- 数值表达式; base -- 可选,底数,默认为 e。
    
  4. pe = torch.zeros(max_len, d_model)
    pe[:, 0::2]
    # 第一个维度取所有,第二个维度从0开始,到最后结束,间隔为2。
    
  5. torch.Tensor的4种乘法

    • 点乘

    a与b做*乘法,原则是如果a与b的size不同,则以某种方式将a或b进行复制,使得复制后的a和b的size相同,然后再将a和b做 element-wise 的乘法。

    一、 * 标量

    >>> a = torch.ones(3,4)
    >>> a
    tensor([[1., 1., 1., 1.],
            [1., 1., 1., 1.],
            [1., 1., 1., 1.]])
    >>> a * 2
    tensor([[2., 2., 2., 2.],
            [2., 2., 2., 2.],
            [2., 2., 2., 2.]])
    

    二、*一维向量

    注意此时要求Tensor的列数与行向量的列数相等

    >>> a = torch.ones(3,4)
    >>> a
    tensor([[1., 1., 1., 1.],
            [1., 1., 1., 1.],
            [1., 1., 1., 1.]])
    >>> b = torch.Tensor([1,2,3]).reshape((3,1))
    >>> a : torch.Size([3, 4]),    b : torch.Size([3, 1])
    >>> b
    tensor([[1.],
            [2.],
            [3.]])
    >>> a * b
    tensor([[1., 1., 1., 1.],
            [2., 2., 2., 2.],
            [3., 3., 3., 3.]])
    

    三、*矩阵

    如果两个二维矩阵A与B做点积A * B,则要求A与B的维度完全相同,即A的行数=B的行数,A的列数=B的列数

    >>> a = torch.tensor([[1, 2], [2, 3]])
    >>> a * a
    tensor([[1, 4],
            [4, 9]])
    

    四、broadcast

    点积是broadcast的。broadcast是torch的一个概念,简单理解就是在一定的规则下允许高维Tensor和低维Tensor之间的运算。
    这里举一个点积broadcast的例子。在例子中,a是二维Tensor,b是三维Tensor,但是a的维度与b的后两位相同,那么a和b仍然可以做点积,点积结果是一个和b维度一样的三维Tensor,运算规则是:若c = a * b, 则c[i,,] = a * b[i, *, *],即沿着b的第0维做二维Tensor点积,或者可以理解为运算前将a沿着b的第0维也进行了expand操作,即a = a.expand(b.size()); a * b。

    >>> a = torch.tensor([[1, 2], [2, 3]])
    >>> b = torch.tensor([[[1,2],[2,3]],[[-1,-2],[-2,-3]]])
    >>> a * b
    tensor([[[ 1,  4],
             [ 4,  9]],
    
            [[-1, -4],
             [-4, -9]]])
    >>> b * a
    tensor([[[ 1,  4],
             [ 4,  9]],
    
            [[-1, -4],
             [-4, -9]]])
    
    • torch.mul

    和* 一样,也是element-wise的乘法,也是支持broadcast的。

    1. 乘标量
    >>> a = torch.ones(3,4)
    >>> a
    tensor([[1., 1., 1., 1.],
            [1., 1., 1., 1.],
            [1., 1., 1., 1.]])
    >>> a * 2
    tensor([[2., 2., 2., 2.],
            [2., 2., 2., 2.],
            [2., 2., 2., 2.]])
    
    
    
    2. 乘行向量
    >>> a = torch.ones(3,4)
    >>> a
    tensor([[1., 1., 1., 1.],
            [1., 1., 1., 1.],
            [1., 1., 1., 1.]])
    >>> b = torch.Tensor([1,2,3,4])
    >>> b
    tensor([1., 2., 3., 4.])
    >>> torch.mul(a, b)
    tensor([[1., 2., 3., 4.],
            [1., 2., 3., 4.],
            [1., 2., 3., 4.]])
    
    
    
    3. 乘列向量
    >>> a = torch.ones(3,4)
    >>> a
    tensor([[1., 1., 1., 1.],
            [1., 1., 1., 1.],
            [1., 1., 1., 1.]])
    >>> b = torch.Tensor([1,2,3]).reshape((3,1))
    >>> b
    tensor([[1.],
            [2.],
            [3.]])
    >>> torch.mul(a, b)
    tensor([[1., 1., 1., 1.],
            [2., 2., 2., 2.],
            [3., 3., 3., 3.]])
    
    
    
    4. 乘矩阵
    # 二维矩阵 mul 二维矩阵
    >>> a = torch.tensor([[1, 2], [2, 3]])
    >>> torch.mul(a,a)
    tensor([[1, 4],
            [4, 9]])
    
    # 二维矩阵 mul 三维矩阵(broadcast)
    >>> a = torch.tensor([[1, 2], [2, 3]])
    >>> b = torch.tensor([[[1,2],[2,3]],[[-1,-2],[-2,-3]]])
    >>> torch.mul(a,b)
    tensor([[[ 1,  4],
             [ 4,  9]],
    
            [[-1, -4],
             [-4, -9]]])
    
    • torch.mm

    数学里的矩阵乘法,要求两个Tensor的维度满足矩阵乘法的要求.

    >>> a = torch.ones(3,4)
    >>> b = torch.ones(4,2)
    >>> torch.mm(a, b)
    tensor([[4., 4.],
            [4., 4.],
            [4., 4.]])
    
    • torch.matmul

torch.mm的broadcast版本.

当输入有多维时,把多出的一维作为batch提出来,其他部分做矩阵乘法。

>>> a = torch.ones(3,4)
>>> b = torch.ones(5,4,2)
>>> torch.matmul(a, b)
tensor([[[4., 4.],
         [4., 4.],
         [4., 4.]],

        [[4., 4.],
         [4., 4.],
         [4., 4.]],

        [[4., 4.],
         [4., 4.],
         [4., 4.]],

        [[4., 4.],
         [4., 4.],
         [4., 4.]],

        [[4., 4.],
         [4., 4.],
         [4., 4.]]])

torch.Size([5, 3, 2])
  1. # 向模块添加持久缓冲区,这个变量在训练过程中不会随着模型训练变化
    self.register_buffer('pe', pe)
    
  2. # 计算矩阵的上三角阵, k表示从第几条对角线起保留数据。 正值是主对角线往上数,负值是往下数。k=0时表示从主对角线开始保留。
    np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1)
    >>>array([[ 1,  2,  3],
           [ 4,  5,  6],
           [ 0,  8,  9],
           [ 0,  0, 12]])
     
    np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], 1)
    >>>array([[0, 2, 3],
           [0, 0, 6],
           [0, 0, 0],
           [0, 0, 0]])
     
    np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], 0)
    >>>array([[1, 2, 3],
           [0, 5, 6],
           [0, 0, 9],
           [0, 0, 0]])
    
  3. nn.Linear(in_futures, out_futures,bias=True)
    # in_features指的是输入的二维张量的大小,即输入的[batch_size, size]中的size。
    
    # out_features指的是输出的二维张量的大小,即输出的二维张量的形状为[batch_size,output_size],当然,它也代表了该全连接层的神经元个数。
    
    # 从输入输出的张量的shape角度来理解,相当于一个输入为[batch_size, in_features]的张量变换成了[batch_size, out_features]的输出张量。
    
  4. tensor.repeat(1, n_heads, 1, 1)
    # 在对应的维度填重复的遍数即可
    
  5. # torch.gt(a,b)函数比较a中元素大于(这里是严格大于)b中对应元素,大于则为1 (True),不大于则为0 (False),这里a为Tensor,b可以为与a的size相同的Tensor或常数。
    >>> import torch
    >>> a=torch.randn(2,4)
    >>> a
    tensor([[-0.5466,  0.9203, -1.3220, -0.7948],
            [ 2.0300,  1.3090, -0.5527, -0.1326]])
    >>> b=torch.randn(2,4)
    >>> b
    tensor([[-0.0160, -0.3129, -1.0287,  0.5962],
            [ 0.3191,  0.7988,  1.4888, -0.3341]])
    >>> torch.gt(a,b)            #得到a中比b中元素大的位置
    tensor([[0, 1, 0, 0],
            [1, 1, 0, 1]], dtype=torch.uint8)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值