PyTorch深度学习框架——初识

发布时间:2025-01-24 14:01

PyTorch深度学习框架

简单介绍

\"PyTorch深度学习框架——初识_第1张图片\"

PyTorch 是一个针对深度学习, 并且使用GPUCPU来优化的tensor library(张量库)。

\"PyTorch深度学习框架——初识_第2张图片\"

学过Tensorflow的人或许有话说,这些事情Tensorflow也能做到的呀?那么pyTorch到底有什么可以很快在深度学习爱好者中迅速发展起来的呢?其实相比较于Tensorflow,两者还是存在不同之处——

  • PyTorch更有利于研究人员、爱好者、小规模项目等快速搞出原型。而TensorFlow更适合大规模部署,特别是需要跨平台和嵌入式部署时。
  • PyTorch本质上是Numpy的替代者,而且支持GPU、带有高级功能,可以用来搭建和训练深度神经网络。而TensorFlow可以看成是一个嵌入Python的编程语言。我们所写的TensorFlow代码会被Python编译成一张图,然后由TensorFlow执行引擎运行。
  • 对于部署上,小规模服务器两个框架都可以用,但是对于移动端嵌入式部署,Tensorflow会表现出更突出的优势。使用TensorFlow,部署在AndroidiOS平台时只需要很小的工作量,至少不必用Java或者C++重写模型的推断部分。对于高性能服务器端的部署,还有TensorFlow Serving能用。除了性能之外,TensorFlow Serving一个显著的优点是可以轻松的热插拔模型,而不会使服务失效。

PyTorch的环境配置

如果之前学习了Tensorflow的朋友们,应该对PyTorch的部署和安装会信手拈来。但是对于初学者来说,需要花一点时间进行摸索。

参考官网配置方法PyTorch官网可以进行安装。因为文件过大,下载过程中出现超时现象,使用清华镜像进行下载,速度比较块。当前操作系统Window10,其他系统可直接参考官网详细说明。

## 在安装之前需要确认cuda是否成功安装并在系统中使用
conda --version

## 下载相关文件,需要注意cuda和pyTorch的版本对应关系!!
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

## 安装
pip install pytorch cuda90 -c pytorch 
pip install torchvision

如果通过镜像下载不下来,可以直接到**torch下载链接**进行下载,然后执行安装命令就可以。

# 离线安装相对应的版本
python install torchvision-0.3.0-py2.py3-none-any.whl

python install torch-1.1.0-cp36-cp36m-win_amd64.whl #python36,windowns 64
  • 检测是否安装成功

    ## 检测是否安装成功
    python
    >> import torch
    >> import torchvision
    >> torch.cuda.is_available()
    True #显示True表示安装成功,并且可用
    

PyTorch的张量的基本介绍和创建

张量简介

张量在数学中,就是一个多维数组,它是标量、向量、矩阵的高维拓展。
\"PyTorch深度学习框架——初识_第3张图片\"

标量是一个0维张量,向量是一个1维张量,矩阵是一个2维张量,但是有些高维数值就无法用标量、向量、矩阵来表示了,比如彩色图片的像素点,其中还包括RGB通道的,那么此时就需要进行高维拓展——张量

但是在PyTorch中张量不仅仅表示多维数组,也是自动求导的关键。其中VariablePyTorch-0.4.0版本之前的一个数据类型,虽然在0.4.0版本之后已经并入Tensor中,但是Variable这个数据类型还是需要了解的。这个数据类型和Tensorflow-1.0版本中的Variable还是有所不同之处。在Pytorch中,Variable主要是用于封装Tensor,进行自动求导

PyTorch的数据类型总共有9种数据类型,其中使用频率最高的是torch.float32或者torch.floattorch.int64或者torch.long。比如前者主要使用到卷积层的权值和图像处理中都默认float32,后者主要是在交叉熵或者计算损失函数中会用到的比较多。

创建方式
直接创建
  • 第一种
## 直接创建rensor
torch.tensor(
            data,
            dtype=None,
            device=None,
            requires_grad=False,
            pin_memory)

## data——数据,可以是list,numpy
## dtype——数据类型,默认与data一致
## device——cpu或者cuda
## requires_grad——是否需要自动求导
## pin-memory——是否存于锁页内存,与转换效率有关
  • 第二种

    ## 从numpy创建tensor
    torch.from_numpy(ndarray)
    
    

    使用这种方法创建的tensor和ndarray是共享内存的,当修改任意一个的数据,另一个数据也会被修改的!!!

根据数值创建
  • 第一种

    ## 根据size创建全0张量
    torch.zeros(*size,
               out=None,
               dtype=None,
               layout=torch.strided,
               device=None,
               requires_grad=False)
    ## 根据size创建全1的张量
    torch.ones(*size,
               out=None,
               dtype=None,
               layout=torch.strided,
               device=None,
               requires_grad=False)
    

    size:张量的形状,比如(3,3),(3,224,224)

    out:输出的张量

    layout:内存中的布局形式,有stridedsparse_coo(稀疏矩阵时可以使用,提高读取速度)等

    device:所在设备,cuda/cpu

  • 第二种

    ## 根据input创建全0的张量
    torch.zeros_like(input,
               dtype=None,
               layout=None,
               device=None,
               requires_grad=False)
    
    ## 根据input创建全0的张量
    torch.ones_like(input,
               dtype=None,
               layout=None,
               device=None,
               requires_grad=False)
    
  • 第三种

    ## 使用full方法来创建张量
    torch.full(size,
               full_value,
               out=None,
               dtype=None,
               layout=torch.strided,
               device=None,
               requires_grad=False)
    
    ## 使用full_like方法来创建张量
    torch.full_like(size,
               full_value,
               out=None,
               dtype=None,
               layout=torch.strided,
               device=None,
               requires_grad=False)
    

    full_value:张量的值。

  • 第四种

    ## 创建等差的1维张量
    torch.arange(start=0,
                end,
                step=1,
                out=None,
                dtype=None,
                layout=torch.strided,
                device=None,
                requires_grad=False)
    
    ## 创建均分的1维张量,其数值区间是[start,end]
    torch.linspace(start=0,
                end,
                steps=100,
                out=None,
                dtype=None,
                layout=torch.strided,
                device=None,
                requires_grad=False)
    
    ## 创建对数均分的1维张量,长度维steps,底为base
    torch.linspace(start=0,
                end,
                steps=100,
                base=10.0,
                out=None,
                dtype=None,
                layout=torch.strided,
                device=None,
                requires_grad=False)
    

    start:数列的起始值

    end:数列的“结束值”

    step:等差数列中表示数列公差,默认为1

    steps:均分中表示数列长度

    base:对数函数的底,默认是10

  • 第五种

    ## 创建单位对角矩阵(2维张量),默认是方阵
    torch.eye(n,
             m=None,
             out=None,
             dtype=None,
             layout=torch.strided,
             device=None,
             requires_grad=False)
    

    n :矩阵行数

    m :矩阵列数

根据概率分布创建
  • 第一种

    ## 正态分布(高斯分布)
    torch.normal(mean,
                std,
                out=None)
    
    ## 存在四种模式,mean分别是标量和张量,std也分别存在标量和张量两种情况,每一种情况生成的张量都是不全相同的。
    torch.normal(mean,
                std,
                size,
                out=None)
    
    ## 标准正态分布
    torch.randn(*size,
               out=None,
               dtype=None,
               layout=torch.strided,
               device=None,
               requires_grad=False)
    #或者
    torch.randn_like(*size,
               out=None,
               dtype=None,
               layout=torch.strided,
               device=None,
               requires_grad=False)
    

    mean:均值

    std:标准差

    size:张量的形状

  • 第二种

    ## 在[0,1]之间生成均匀分布
    torch.rand(*size,
            out=None,
            dtype=None,
            layout=torch.strided,
            device=None,
            requires_grad=False)
    
    # 或者
    torch.rand_like(*size,
            out=None,
            dtype=None,
            layout=torch.strided,
            device=None,
            requires_grad=False)
    
    ## 在[low,high)之间生成整数均匀分布
    torch.randint(low=0,
            high,
        	size,
            out=None,
            dtype=None,
            layout=torch.strided,
            device=None,
            requires_grad=False)
    
    # 或者
    torch.randint_like(low=0,
            high,
        	size,
            out=None,
            dtype=None,
            layout=torch.strided,
            device=None,
            requires_grad=False)
    
  • 第三种

    ## 生成从0到n-1的随机排列
    torch.randperm(n,
            out=None,
            dtype=torch.int64,
            layout=torch.strided,
            requires_grad=False)
    

    n:张量的长度

  • 第四种

    ## 以input为概率,生成伯努利分布(0-1分布)
    torch.bernoulli(input,
                    *,
                    generator=None,
                    out=None)
    

    input:概率值

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号