zoukankan      html  css  js  c++  java
  • 『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较_&_广播原理简介

    一、简单数学操作

    1、逐元素操作

    t.clamp(a,min=2,max=4)近似于tf.clip_by_value(A, min, max),修剪值域。
    a = t.arange(0,6).view(2,3)
    print("a:",a)
    print("t.cos(a):",t.cos(a))
    print("a % 3:",a % 3)  # t.fmod(a, 3)
    print("a ** 2:",a ** 2)  # t.pow(a, 2)
    print("t.clamp(a, min=2, max=4)",t.clamp(a,min=2,max=4))
    
    a: 
     0  1  2
     3  4  5
    [torch.FloatTensor of size 2x3]
    
    t.cos(a): 
     1.0000  0.5403 -0.4161
    -0.9900 -0.6536  0.2837
    [torch.FloatTensor of size 2x3]
    
    a % 3: 
     0  1  2
     0  1  2
    [torch.FloatTensor of size 2x3]
    
    a ** 2: 
      0   1   4
      9  16  25
    [torch.FloatTensor of size 2x3]
    
    t.clamp(a, min=2, max=4) 
     2  2  2
     3  4  4
    [torch.FloatTensor of size 2x3]

    2、归并操作

    b = t.ones(2,3)
    print("b.sum():",b.sum(dim=0,keepdim=True))
    print("b.sum():",b.sum(dim=0,keepdim=False))
    
    b.sum(): 
     2  2  2
    [torch.FloatTensor of size 1x3]
    
    b.sum(): 
     2
     2
     2
    [torch.FloatTensor of size 3]
    

    cumsum和cumprob(累加和累乘)属于特殊的归并,结果相对于输入并没有降维。

    3、比较操作

    之前有说过,t.max用法较为特殊;而a.topk是个对于深度学习很是方便的函数。

    a = t.linspace(0,15,6).view(2,3)
    print("a:",a)
    print("a.sort(2):
    ",a.sort(dim=1))  # 在某个维度上排序
    print("a.topk(2):
    ",a.topk(2,dim=1))  # 在某个维度上寻找top-k
    print("t.max(a):
    ",t.max(a))  # 不输入dim的话就是普通的max
    print("t.max(a,dim=1):
    ",t.max(a,dim=1))  # 输入dim的话就会集成argmax的功能
    
    a: 
      0   3   6
      9  12  15
    [torch.FloatTensor of size 2x3]
    
    a.sort(2):
     (
      0   3   6
      9  12  15
    [torch.FloatTensor of size 2x3]
    , 
     0  1  2
     0  1  2
    [torch.LongTensor of size 2x3]
    )
    a.topk(2):
     (
      6   3
     15  12
    [torch.FloatTensor of size 2x2]
    , 
     2  1
     2  1
    [torch.LongTensor of size 2x2]
    )
    t.max(a):
     15.0
    t.max(a,dim=1):
     (
      6
     15
    [torch.FloatTensor of size 2]
    , 
     2
     2
    [torch.LongTensor of size 2]
    )

    二、Numpy和Tensor

    1、数组和张量内存共享

    import numpy as np
    
    # 数组和Tensor互换
    a = t.ones(2,3)
    b = a.numpy()
    c = t.from_numpy(b)
    c[0,0] = 0
    print(a)
    
     0  1  1
     1  1  1
    [torch.FloatTensor of size 2x3]

    2、广播原理及模拟

    # 广播法则
    # 1.所有数组向shape最长的数组看齐,不足的在前方补一
    # 2.两个数组要么在某个维度长度一致,要么一个为一,否则不能计算
    # 3.对长度为一的维度,计算时复制元素扩充至和此维度最长数组一致
    a = t.ones(3,2)
    b = t.ones(2,3,1)
    print(a + b)  # 先a->(1,3,2)然后a,b->(2,3,2)
    
    (0 ,.,.) = 
      2  2
      2  2
      2  2
    
    (1 ,.,.) = 
      2  2
      2  2
      2  2
    [torch.FloatTensor of size 2x3x2]
    

    使用尺寸调整函数模拟广播过程如下,

    # 手工复现广播过程
    # expend可以扩张维度的数字大小,repeat类似,但是expend不会复制数组内存,节约空间
    # 被扩充维度起始必须是1才行
    print(a.unsqueeze(0).expand(2,3,2) + b.expand(2,3,2))
    print(a.view(1,3,2).expand(2,3,2) + b.expand(2,3,2))
    
    (0 ,.,.) = 
      2  2
      2  2
      2  2
    
    (1 ,.,.) = 
      2  2
      2  2
      2  2
    [torch.FloatTensor of size 2x3x2]
    
    
    (0 ,.,.) = 
      2  2
      2  2
      2  2
    
    (1 ,.,.) = 
      2  2
      2  2
      2  2
    [torch.FloatTensor of size 2x3x2]

    3、expand方法

    我们来看看expand方法,它要求我们的被扩展维度为1才行(如下),如果不是1则扩展失败。

    expand方法不会复制数组,不会占用额外空间,只有在需要时才进行扩展,很节约内存。

    a = t.ones(1)
    print(a.shape)
    b = a.expand(6)
    a = 2
    print(a)
    
    torch.Size([1])
    2
    
     1
     1
     1
     1
     1
     1
    [torch.FloatTensor of size 6]
  • 相关阅读:
    06-引用类初始化问题
    mac系统下Eclipse + pydev配置python Interpreter
    spring 整合mongodb报NoSuchMethodError错误
    mybatis在spring(Controller) 中的事务配置问题
    IT经理工作职责
    postman具体讲解
    用Jmeter进行接口测试及乱码问题
    购物车测试点
    web测试流程的总结及关注点
    fiddler常见的应用场景
  • 原文地址:https://www.cnblogs.com/hellcat/p/8445295.html
Copyright © 2011-2022 走看看