P6 PyTorch 常用数学运算

前言:

      这里主要介绍一下PyTorch 的常用数学运算

   

目录:

   1: add|sub 加减法

    2:   mul/div  乘/除运算

    3:   矩阵乘法

    4    2D矩阵转置

    5  其它常用数学运算

    6  clamp 梯度剪裁

一  加减法

      1.1 加法

   可以直接通过符号+ 或者 torch.add 

# -*- coding: utf-8 -*-
"""
Created on Tue Dec 20 20:24:10 2022

@author: cxf
"""
import torch

def add():
    
    a = torch.tensor([[1.0,2.0,3.0,4.0],
                     [1.0,2.0,3.0,4.0],
                     [1.0,2.0,3.0,4.0]])
    
    
    b = torch.tensor([3.0,2.0,1.0,-4.0])
    
    
    c = torch.add(a,b)
    
    print(c)
    
    
if __name__ == "__main__":
    add()
    

 a的shape [3,4]

 b 的shape[4] 先做broadcasting 插入一个维度后,做行复制

然后相加,结果为

1.2 减法

   

# -*- coding: utf-8 -*-
"""
Created on Tue Dec 20 20:24:10 2022

@author: cxf
"""
import torch

def sub():
    
    a = torch.tensor([[1.0,2.0,3.0,4.0],
                     [1.0,2.0,3.0,4.0],
                     [1.0,2.0,3.0,4.0]])
    
    
    b = torch.tensor([3.0,2.0,1.0,-4.0])
    
    
    c = torch.sub(a,b)
    
    d = a -b
    
    
    
    print(torch.all(torch.eq(c,d)))
    
    
if __name__ == "__main__":
    sub()
    

 一种用符号 - 或者 用api  torch.sub 

输出:


二   乘/除运算

    2.1 乘

            可以通过符号* 或者mul

# -*- coding: utf-8 -*-
"""
Created on Tue Dec 20 20:24:10 2022

@author: cxf
"""
import torch

def mul():
    
    a = torch.tensor([[1.0,2.0,3.0,4.0],
                     [1.0,2.0,3.0,4.0],
                     [1.0,2.0,3.0,4.0]])
    
    
    b = torch.tensor([1.0,0.5,1.0,0.25])
    
    
    c = torch.mul(a,b)
    
    d = a*b
    
    
    
    print(torch.all(torch.eq(c,d)))
    print(c)
    
    
if __name__ == "__main__":
    mul()

对应点位置相乘,输出如下

 2.2 除

   

def divide():
    
    a = torch.tensor([[1.0,2.0,3.0,4.0],
                     [1.0,2.0,3.0,4.0],
                     [1.0,2.0,3.0,4.0]])
    
    
    b = torch.tensor([1.0,2.0,3.0,4.0])
    
    
    c = torch.div(a,b)
    
    d = a/b
    
    
    
    print(torch.all(torch.eq(c,d)))
    print(c)

b 做broadcast(插入一个维度后 变成[1,4] 然后做行复制)     

输出:

# -*- coding: utf-8 -*-
"""
Created on Tue Dec 20 20:24:10 2022

@author: cxf
"""
import torch

def mat():
    
    a = torch.tensor([[1.0,2.0],
                      [1.0,2.0]])
    
    b = torch.tensor([1.0,0.5]) #[2]
    b = b.unsqueeze(1) #[2,1]
    c = torch.mm(a,b)
    
    print("\n 矩阵2D 相乘:\n ",c.numpy())

三  矩阵乘法

    3.1 mm  2D 向量相乘

           

"""
Created on Tue Dec 20 20:24:10 2022

@author: cxf
"""
import torch

def mat():
    
    a = torch.tensor([[1.0,2.0],
                      [1.0,2.0]])
    
    b = torch.tensor([1.0,0.5]) #[2]
    b = b.unsqueeze(1) #[2,1]
    c = torch.mm(a,b)
    
    print("\n 矩阵2D 相乘:\n ",c.numpy())
    
    
if __name__ == "__main__":
    mat()
    

输出:

 2.2 matmul

      这种是最常用的推荐方法,多多维度的张量,依然只取最后两维做2D mm,其它的维度保持不变

    c = torch.matmul(a, b)

    

2.3 @

    重载符号,实现matmul 功能

     c = a@b


四  2D 矩阵转置

   

def mat():
    
    a = torch.tensor([[1,1,1],
                      [2,2,2]])
    
    b = torch.tensor([[1,1,1],
                      [1,2,2]])
    
    c= a@b.t()
    
    print(c)

  当多维向量的时候,使用的transpose

  


五  常用的数学符号

     pow  #平方

     rsqrt  #平方根

    exp  指数运算

     log  对数运算

     floor  向下取整

     ceil   向上取整

     trunc  取整

    round  四舍五入


六   clamp  梯度剪裁

  在深度学习中,网络层次比较深的时候,有的时候为了防止梯度爆炸,或者梯度消失

需要做梯度剪裁,抑制过大过小的值。

# -*- coding: utf-8 -*-
"""
Created on Mon Dec 19 17:24:41 2022

@author: chengxf2
"""

import numpy 
import torch

def clamp():
    
    grad = torch.rand(3,3)*10
    
  
    
    print("\n 梯度 ",grad)
    
    new_grad1 = grad.clamp(5.0)
    
    new_grad2 = grad.clamp(0,5)
    
    print("\n 梯度1 ",new_grad1)
    print("\n 梯度2 ",new_grad2)
    
    
    
clamp()

输出:

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值