• PyTorch : 了解Tensor(张量)及其创建方法


    本文已收录于Pytorch系列专栏: Pytorch入门与实践 专栏旨在详解Pytorch,精炼地总结重点,面向入门学习者,掌握Pytorch框架,为数据分析,机器学习及深度学习的代码能力打下坚实的基础。免费订阅,持续更新。

    认识张量

    张量是一个多维数组 ,它是标量、向量、矩阵的高维拓展。

    比如说对于一张图片,它是3维张量,其中RGB就是其第三维张量。

    Tensor与 Variable

    Variable是Pytorch的0.4.0版本之前的一个重要的数据结构,但是从0.4.0开始,它已经并入了Tensor中了。

    Variable是 torch.autograd 中的数据类型,主要用于封装Tensor ,进行自动求导。

    • data: 被包装的 Tensor
    • grad: data 的梯度
    • grad_fn: 创建 Tensor 的 Function ,是自动求导的关键。比如说是加法还是乘法之类的。
    • requires_grad: 指示是否需要梯度,有些不需要梯度,设置为false可以节省内存。
    • is_leaf: 指示是否是叶子结点(张量)

    Tensor

    PyTorch0.4.0版开始, Variable 并入 Tensor

    • dtype: 张量的数据类型,如 torch.FloatTensor FloatTensor, torch.cuda.FloatTensor(cuda表示数据放在了GPU上)

    • shape: 张量的形状,如 (64, 3, 224, 224)

    • device: 张量所在设备, GPU/CPU ,是加速的关键

    张量的创建

    一、直接创建

    torch.tensor()

    功能:从data 创建 tensor

    • data : 数据 , 可以是 list, numpy
    • dtype : 数据类型,默认与 data 的一致
    • device 所在设备 , cuda cpu
    • requires_grad :是否需要梯度
    • pin_memory :是否存于锁页内存

    实例如下:

    import torch
    import numpy as np
    
    # Create tensors via torch.tensor
    
    flag = True
    
    if flag:
        arr = np.ones((3, 3))
        print("type of data:", arr.dtype)
    
        t = torch.tensor(arr, device='cuda')
        print(t)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    type of data: float64
    tensor([[1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.]], device='cuda:0', dtype=torch.float64)
    
    • 1
    • 2
    • 3
    • 4

    其中,cuda表示采用了gpu,0是gpu的标号,由于只有一个gpu,因此是0。

    torch.from_numpy(ndarray)

    功能:从numpy 创建 tensor

    注意事项:从 torch.from_numpy 创建的 tensor 于原 ndarray 共享内存 ,当修改其中一个的数据,另外一个也将会被改动。

    实例代码:

        # Create tensors via torch.from_numpy(ndarray)
        arr = np.array([[1, 2, 3], [4, 5, 6]])
        t = torch.from_numpy(arr)
        print("numpy array: ", arr)
        print("tensor : ", t)
    
        print("\n修改arr")
        arr[0, 0] = 0
        print("numpy array: ", arr)
        print("tensor : ", t)
    
        print("\n修改tensor")
        t[0, 0] = -1
        print("numpy array: ", arr)
        print("tensor : ", t)
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    通过结果可见,指向相同。

    numpy array:  [[1 2 3]
     [4 5 6]]
    tensor :  tensor([[1, 2, 3],
            [4, 5, 6]], dtype=torch.int32)
    
    修改arr
    numpy array:  [[0 2 3]
     [4 5 6]]
    tensor :  tensor([[0, 2, 3],
            [4, 5, 6]], dtype=torch.int32)
    
    修改tensor
    numpy array:  [[-1  2  3]
     [ 4  5  6]]
    tensor :  tensor([[-1,  2,  3],
            [ 4,  5,  6]], dtype=torch.int32)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    二、依据数值创建

    2.1 torch.zeros()

    功能:依size 创建全 0 张量

    • size : 张量的形状 , 如 (3,3),(3,224,224)
    • out : 输出的张量
    • layout 内存中布局形式 , 有strided(默认), sparse_coo(这个通常稀疏矩阵时设置,提高读取效率) 等
    • device 所在设备 , gpu cpu
    • requires_grad :是否需要梯度

    code:

        out_t = torch.tensor([1])
    
        t = torch.zeros((3, 3), out=out_t)
    
        print(t, '\n', out_t)
        print(id(t), id(out_t), id(t) == id(out_t))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可见,该out的值与t相同,因此out是一个输出的作用,将张量生成的数据赋值给另一个变量。

    tensor([[0, 0, 0],
            [0, 0, 0],
            [0, 0, 0]]) 
     tensor([[0, 0, 0],
            [0, 0, 0],
            [0, 0, 0]])
    2211683380904 2211683380904 True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    2.2 torch.zeros_like()

    功能:依据input 形状创建全 0 张量

    • intput : 创建与 input 同形状的全 0 张量
    • dtype : 数据类型
    • layout 内存中布局形式
    2.3 torch. ones()
    2.4 torch. ones_like()

    功能:input 形状创建全 1 张量

    其他参数一样同上。

    2.5 torch. full()
    2.6 torch.full_like()

    功能:依据input 形状创建指定数据的张量

    • size : 张量的形状 , 如 (3,3)
    • fill_value : 张量的值

    code

        t = torch.full((3, 3), 5)
        print(t)
    
    • 1
    • 2
    tensor([[5, 5, 5],
            [5, 5, 5],
            [5, 5, 5]])
    
    • 1
    • 2
    • 3
    2.7 torch. arange

    功能:创建等差的1 维张量

    注意事项:数值区间为[start,end)

    • start : 数列起始值
    • end : 数列“结束值”
    • step : 数列公差,默认为 1

    code

        t = torch.arange(2, 10, 2)
        print(t)
    
    • 1
    • 2
    tensor([2, 4, 6, 8])
    
    • 1
    2.8 torch. linspace

    功能:创建均分的1 维张量

    注意事项:数值区间为[start,end)

    • start : 数列起始值
    • end : 数列结束值
    • steps : 数列长度,注意是长度。

    它的步长就是(end - start)/ steps。

        t = torch.linspace(2, 10, 6)
        print(t)
    
    • 1
    • 2
    tensor([ 2.0000,  3.6000,  5.2000,  6.8000,  8.4000, 10.0000])
    
    • 1
    2.9 torch. logspace

    功能:创建对数均分的1 维张量

    注意事项:长度为steps, 底为 base

    • start : 数列起始值
    • end : 数列结束值
    • steps : 数列长度
    • base : 对数函数的底,默认为 10
    2.10 torch. eye()

    功能:创建单位对角矩阵(2 维张量)

    注意事项:默认为方阵

    • n : 矩阵行数
    • m : 矩阵列数

    三、依概率分布创建张量

    3.1 torch. normal()

    功能:生成正态分布(高斯分布)

    • mean : 均值

    • std : 标准差

    四种模式:
    mean为标量, std为标量
    mean为标量, std为张量
    mean为张量, std为标量
    mean为张量, std为张量

    后三种基本用法相同,都是根据不同的维数进行

    code:

        # the mean and std both are tensors
        mean = torch.arange(1, 5, dtype=torch.float)
        std = torch.arange(1, 5, dtype=torch.float)
        t_normal = torch.normal(mean, std)
        print("mean:{}\nstd:{}".format(mean, std))
        print(t_normal)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    由结果可知,其生成的tensor是上面每一维度的参数生成的。

    mean:tensor([1., 2., 3., 4.])
    std:tensor([1., 2., 3., 4.])
    tensor([1.6614, 2.5338, 3.1850, 6.4853])
    
    • 1
    • 2
    • 3

    需要注意的是,对于mean和std都是标量的情况下,需要指定生成的size。

        # mean: scalar std: scalar
        t_normal = torch.normal(0., 1., size=(4,))
        print(t_normal)
    
    • 1
    • 2
    • 3
    tensor([0.6614, 0.2669, 0.0617, 0.6213])
    
    • 1
    3.2 torch. randn ()
    3.3 torch. randn_like ()

    功能:生成标准正态分布(均值为0,方差为1)

    size : 张量的形状。

    3.4 torch. rand()
    3.5 torch. rand_like

    功能:在区间[0,1) 上,生成均匀分布

    3.6 torch. randint ()
    3.7 torch. randint_like ()

    功能:区间[low, high) 生成整数均匀分布

    size : 张量的形状

    3.8 torch. randperm ()

    功能:生成生成从0 到 n-1 的随机排列

    n : 张量的长度

    3.9 torch. bernoulli ()

    功能 :以 input 为概率,生成伯努力分布(0 1 分布,两点分布)

    input : 概率值

  • 相关阅读:
    redis一条set命令的执行过程
    C专家编程 第3章 分析C语言的声明 3.2 声明是如何形成的
    HTML5期末大作业:HTML+CSS茶叶官网网页设计实例 企业网站制作
    [LeetCode] 九坤-03. 数字默契考验
    【数据结构】队列
    排序算法-归并排序
    Qt / Qt Quick程序打包的一些坑 (三)
    enable_if
    Apifox : 不仅是Api调试工具,更是开发团队的协作神器
    springboot系列(二十三):如何实现Excel文件导入?这你得会 | 超级详细,建议收藏
  • 原文地址:https://blog.csdn.net/m0_52316372/article/details/127576483