美文网首页
PyTorch学习---1.数据整理

PyTorch学习---1.数据整理

作者: 与世无争小菜鸡 | 来源:发表于2021-02-25 09:15 被阅读0次

    PyTorch的安装

    要学习PyTorch自然是先要把它安装好,PyTorch的安装相对来说比较简单,不会的可以直接去它的官网看,点我就是去官网的路,点开之后往下拉就能看到下面的图片:

    安装命令
    下面就是根据你机器的类型以及需要安装的版本来自由组合了,大部分人应该都会了。最后需要检验一下你的PyTorch是否安装成功,运行下面两行代码即可:
    import torch
    print(torch.__version__)
    

    Tensor的创建

    Tensor是PyTorch中的基本数据类型,它的创建有很多种方式,下面整理出几种大家会经常用到的:

    x = torch.empty(5, 3)  #全空值
    x = torch.rand(5, 3)   #随机
    x = torch.ones(5, 3, dtype=torch.long)  #全1,并指定类型
    x = torch.zeros(5, 3, dtype=torch.long)
    x = torch.tensor([5.5, 3])
    x = x.new_ones(5, 3, dtype=torch.float64)      # 返回的tensor默认具有相同的torch.dtype和torch.device
    x = torch.zeros_like(x, dtype=torch.float)    # 指定新的数据类型
    #获取Tensor形状的两种方式
    print(x.size())
    print(x.shape)         
    

    更多相关函数的使用如下表所示。


    Tensor的创建

    Tensor的操作

    1,算术操作
    我们以加法为例展示Tensor算术操作的三种形式:

    # 1,正常形式,x已经定义过
    y = torch.rand(5, 3)
    print(x + y)
    #2,函数形式
    print(torch.add(x, y))
    result = torch.empty(5, 3)
    torch.add(x, y, out=result)
    print(result)
    #3,inplace  PyTorch操作inplace版本都有后缀"_", 例如x.copy_(y), x.t_()
    # adds x to y
    y.add_(x)
    print(y)
    

    2,索引
    我们还可以使用类似NumPy的索引操作来访问Tensor的一部分,需要注意的是:索引出来的结果与原数据共享内存,也即修改一个,另一个会跟着修改。

    y = x[0, :]
    y += 1
    print(y)
    print(x[0, :]) # 源tensor也被改了
    

    另外Tensor还有一些比较高级的索引操作,如下图所示。
    [图片上传失败...(image-60f35f-1614215727524)]

    3,形状改变
    用view()来改变Tensor的形状:

    y = x.view(15)
    z = x.view(-1, 5)  # -1所指的维度可以根据其他维度的值推出来
    

    另外view()返回的新tensor与源tensor共享内存,也即更改其中的一个,另外一个也会跟着改变。

    x += 1
    print(x)
    print(y) # 也加了1
    

    当然,如果不想共享内存,推荐先用clone创造一个副本然后再使用view。

    x_cp = x.clone().view(15)
    x -= 1
    print(x)
    print(x_cp)
    #x_cp不会改变,x变了
    

    还有一个常用的函数就是item(), 它可以将一个标量Tensor转换成一个Python number:

    x = torch.randn(1)
    print(x)
    print(x.item())
    #输出为 :
    tensor([2.3466])
    2.3466382026672363
    

    广播机制

    广播是Tensor的一个非常重要的性质,个人看来广播就是为了方便计算自动匹配形状的机制。就是当对两个形状不同的Tensor按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个Tensor形状相同后再按元素运算。例如:

    x = torch.arange(1, 3).view(1, 2)
    print(x)
    y = torch.arange(1, 4).view(3, 1)
    print(y)
    print(x + y)
    #由于x和y分别是1行2列和3行1列的矩阵,如果要计算x + y,
    #那么x中第一行的2个元素被广播(复制)到了第二行和第三行,
    #而y中第一列的3个元素被广播(复制)到了第二列。如此,就可以对2个3行2列的矩阵按元素相加。
    

    Tensor和Numpy的相互转换

    我们很容易用numpy()from_numpy()将Tensor和NumPy中的数组相互转换。但是需要注意的一点是: 这两个函数所产生的的Tensor和NumPy中的数组共享相同的内存(所以他们之间的转换很快),改变其中一个时另一个也会改变!!!
    还有一个常用的将NumPy中的array转换成Tensor的方法就是torch.tensor(), 需要注意的是,此方法总是会进行数据拷贝(就会消耗更多的时间和空间),所以返回的Tensor和原来的数据不再共享内存。
    1,Tensor转Numpy
    使用numpy()将Tensor转换成NumPy数组:

    a = torch.ones(5)
    b = a.numpy()
    print(a, b)
    
    a += 1
    print(a, b)
    b += 1
    print(a, b)
    #a,b内容相同
    

    2,Numpy转Tensor
    使用from_numpy()将NumPy数组转换成Tensor:

    import numpy as np
    a = np.ones(5)
    b = torch.from_numpy(a)
    print(a, b)
    
    a += 1
    print(a, b)
    b += 1
    print(a, b)
    #a,b内容相同
    

    所有在CPU上的Tensor(除了CharTensor)都支持与NumPy数组相互转换。
    此外上面提到还有一个常用的方法就是直接用torch.tensor()将NumPy数组转换成Tensor,需要注意的是该方法总是会进行数据拷贝,返回的Tensor和原来的数据不再共享内存。

    c = torch.tensor(a)
    a += 1
    print(a, c)
    #a,c内容不相同
    

    Tensor on GPU

    用方法to()可以将Tensor在CPU和GPU(需要硬件支持)之间相互移动。

    # 以下代码只有在PyTorch GPU版本上才会执行
    if torch.cuda.is_available():
        device = torch.device("cuda")          # GPU
        y = torch.ones_like(x, device=device)  # 直接创建一个在GPU上的Tensor
        x = x.to(device)                       # 等价于 .to("cuda")
        z = x + y
        print(z)
        print(z.to("cpu", torch.double))       # to()还可以同时更改数据类型
    

    线性代数相关函数

    线性代数相关函数

    相关文章

      网友评论

          本文标题:PyTorch学习---1.数据整理

          本文链接:https://www.haomeiwen.com/subject/kejyfltx.html