• Pytorch-张量的创建与使用方法


    张量的创建及其基本类型

    1.张量(Tensor)函数创建方法

      张量最基本的创建方法和Numpy中创建Array的格式一样,都是创建函数(序列)的格式:张量创建函数: torch.tensor()

    import torch 
    
    # 通过列表创建张量
    t = torch.tensor([1,2])
    
    # 通过元组创建张量
    t = torch.tensor((1,2))
    
    import numpy as np
    
    a = np.array((1,2))
    # 通过数组创建张量
    t1 = torch.tensor(a)
    """
    输出结果为 tensor([1,2],dtype=torch.int32)
    Point: 通过上述返回结果,我们发现张量也有dtype类型
    """
    

    2.张量的类型

      张量和数组类似,都有dtype方法,可返回张量类型.我们发现,整数型的数组默认创建int32(整型)类型,而张量默认创建int64(长整型)类型。相对的,创建浮点型数组时,张量默认是float32(单精度浮点型),而Array则是默认float64(双精度浮点型)。除了数值型张量,常用的常量类型还有布尔型张量,也就是构成张量的各个元素都是布尔类型的张量。

    3.张量类型的转化

    • 张量类型的隐式转化
        和NumPy中的Array相同,当张量各元素属于不同类型时,系统会自动进行隐式转化。
    # 为了保证数据精度,倾向于统一转化成数据精度比较高的
    # 浮点型和整数型的隐式转化
    torch.tensor([1.1,2])
    
    # 布尔型和数值型的隐式转化
    torch.tensor([True,2.0])
    
    • 张量类型的转化方法
        当然,我们还可以使用.float(),.int()等方法对张量类型进行转化。
    t = torch.tensor([1,2])
    
    # 转化为默认浮点型(32位)
    t.float()
    
    # 转化为双精度浮点型
    t.double()
    
    # 转化为16位整数
    t.short()
    

    张量的维度及形变

      张量作为一组数的结构化表示,也同样有维度的概念,简单理解,向量就是一维的数组,而矩阵则是二维的数组,以此类推,在张量中,我们还可以定义更高维度的数组。当然,张量的高维数组和Numpy中的高维Array概念类似。

    1.创建高维张量

    • 用简单序列创建一维数组
        包含"简单"元素的序列可创建一维数组。
    t1 = torch([1,2])
    t1 
    
    # 使用ndim属性查看张量的维度
    t1.ndim
    
    # 使用shape查看形状
    t1.shape
    
    # 和size函数相同
    t1.size()
    

    注:和Numpy不同,PyTorch中的size方法返回结果和shape属性返回结果一致。

    此外,还需要注意有两个常用的函数/方法,用来查看张量的形状。

    # 返回有几个(N-1)维元素
    len(t1)
    
    # 返回总共有几个数
    t1.numel()
    
    • 用"序列"的"序列"创建二维数组
      以此类推,我们还可以用形状相同的序列组成一个新的序列,进而将其转化为二维张量
    # 用list的list创建二维数组
    t2 = torch([[1,2],[3,4]])
    
    • 零维张量
      在PyTorch中,还有一类特殊的张量,被称为零维张量。该类型只包含一个元素,但又不是单独一个数。
    t0 = torch.tensor([1])  # 这个仍然是一维张量
    t0 = torch.tensor(1)    # 这个是零维张量
    
    

    理解零维张量:
    目前我们可以将零维张量视为拥有张量属性的单独的一个数。(例如: 张量可以存在GPU上,但Python的原生数值对象不行,但零维张量就可以,尽管是零维。)从学术名称来说,Python中单独的一个数是scalars(标量),而零维的张量则是tensor。

    • 高维张量
        一般来说,三维及三维以上的张量,我们就将其称为高维张量。当然,在高维张量中,最常见的还是三维张量,我们可以将其理解为二维数组或矩阵的集合。
    a1 = np.array([[1,2,2],[3,4,4]])
    a2 = np.array([[5,6,6],[7,8,8]])
    t3 = torch.tensor([a1,a2])
    t3.shape   # 结果为torch.Size([2,2,3])   包含两个两行三列的矩阵
    

    当然,N维张量的创建方法,我们可以先创建M个N-1维的数组,然后将其拼成一个N维的张量。关于更高维度的张量,我们将在后续遇到时再进行讲解。在张量的学习过程中,三维张量就已经足够。

    2.张量的形变

      张量作为数字的结构化集合,其结构也是根据需求灵活调整的。

    2.1 flatten拉平: 将任意维度张量转化为一维张量

    t2 = torch.tensor([[1,2]
                      ,[3,4]])
    t2.flatten()   # 把张量按行排列拉平
    

    2.2 reshape方法: 任意变形

    t1 = tensor([1.2])
    # 转化为两行一列的张量
    t1.reshape(2,1)
    """
    结果为: tensor([[1],[2]])
    注意: reshape过程中维度的变化: reshape转化后的维度由该方法输入的参数"个数"决定
    """
    

    特殊张量的创建方法

      在很多数值科学计算的过程中,都会创建一些特殊取值的张量,用于模拟特殊取值的矩阵,如全0矩阵,对角矩阵等.因此,PyTorch中也存在很多创建特殊张量的函数。

    1.特殊取值的张量的创建方法

    • 全0张量
    torch.tensor([2,3])  # 创建全是0的两行三列的矩阵
    

    注: 由于zeros就已经确定的张量元素的取值,因此该函数传入的参数实际上是决定了张量的形状

    • 全1张量
    torch.ones([2,3])
    
    • 单位矩阵
    # 返回五行五列的单位矩阵,对角线元素全为1
    torch.eyes(5)
    
    • 对角矩阵
      略有特殊的是,在PyTorch中,需要利用一维张量取创建对焦矩阵。
    t1 = torch.tensor([1,2])
    torch.dialog(t1)
    """
    输出结果为: tensor([[1,0],
                       [0,2]])
    """
    
    • rand: 服从0-1均匀分布的张量
    torch.rand(2,3)
    
    • randn: 服从标准正态分布的张量
    torch.randn(2,3)
    
    • normal: 服从指定正态分布的张量
    torch.normal(2,3,size=(2,2))  # 均值为2,标准差为3的张量
    
    • randint: 整数随机采样结果
    torch.randint(1,10,[2,4]) # 在1-10之间随机抽取整数,组成两行四列的矩阵
    
    • arrange/linsapce: 生成数列
    torch.arrange(5)     # 和range相同
    """
    结果为:
         tensor([0,1,2,3,4])
    """
    
    torch.arraneg(1,5,0.5)    # 从1到5(左闭右开),每隔0.5取值一次
    
    torch.linspace(1,5,3)     # 从1到5(左右都包含),等距取3个数
    
    • empty: 生成位初始化的指定形状矩阵
    torch。empty(2,3)
    
    • full: 根据指定形状,填充指定数值
    torch.full([2,4],2)
    

    2.创建指定形状的数组

    当然我们还能根据指定对象的形状进行数值填充,只需要在上述函数后面加上_like即可。

    t1 = torch.tensor([1,2])
    t2 = torch.tensor([[1,2],[3,4]])
    torch.full_like(t1,2)    # 根据t1形状,填充数值2
    torch.randint_like(t2,1,10)
    torch.zeros_like(t1)
    

    Ponint: (1)更多_like函数,可查阅帮助文档
    (2)需要注意一点的是,_like类型转化需要注意转化前后数据类型一致的问题;

    torch.rand_like(t1)     # t1是整数,而转化后将变成浮点数,此时代码将报错 
    

    张量和其他类型的转化方法

      张量,数组和列表是较为相似的三种类型对象,在实际操作过程中,经常会涉及三种对象的相互转化,在此之前张量的创建过程中,我们看到torch.tensor函数可以直接将数组或者列表转化为张量,而我们也可以将张量转化为数组或者列表。另外,前文介绍了0维张量的概念,此处也将进一步给出零维张量和数值对象的转化方法。

    • numpy方法: 张量转化为数组
    t1.numpy()
    # 当然也可以通过np.array函数直接转化为array
    np.array(t1)
    
    • tolist方法: 张量转化为列表
    t1.tolist()
    
    • list函数: 张量转化为列表
    list(t1)
    

    需要注意的是,此时转化的列表是由一个个零维张量构成的列表,而非张量的数值转化成的列表。

    • .item()方法: 转化为数值
        在很多情况下,我们需要将最终计算的结果张量转化为单独的数值进行输出,此时需要使用.item方法来执行。
    n = torch.tensor(1)
    n.item()
    

    张量的深拷贝

      Python中其他对象类型一样,等号赋值操作实际上是浅拷贝,需要进行深拷贝,则需要使用clone方法。

    s = torch.tensor([1,2])
    t = s.clone()
    
  • 相关阅读:
    Bonding
    负载均衡
    XML
    wireshark
    IE
    轨迹系列7——Socket总结及实现基于TCP或UDP的809协议方法
    轨迹系列6——车载GPS对接方案汇总小结(809、自定义协议、前置库、WS)
    基于R树索引的点面关系判断以及效率优化统计
    WebGIS中以version方式实现代码更新后前端自动读取更新代码的方法
    轨迹系列5——验证轨迹GPS坐标转换为本地坐标的四/七参数是否准确的一种方案
  • 原文地址:https://www.cnblogs.com/Acapplella/p/15154832.html
Copyright © 2020-2023  润新知