pytorch学习记录

Pytorch源码分析

一、Pytorch框架简介

Pytorch概念

Pytorch是torch的python版本,是由Facebook开源的神经网络框架,专门针对 GPU 加速的深度神经网络(DNN)编程。Torch 是一个经典的对多维矩阵数据进行操作的张量(tensor)库,在机器学习和其他数学密集型应用有广泛应用。与Tensorflow的静态计算图不同,pytorch的计算图是动态的,可以根据计算需要实时改变计算图。
张量(tensor)是多维数组,目的是把向量、矩阵推向更高的维度。
有n维度就叫做n维张量。
在这里插入图片描述

计算图(Computation Graph)是一种用于描述数学计算的图形模型,常用于神经网络的前向传播和反向传播算法中。计算图被定义为有向图无环图,其中节点对应于数学运算。 计算图是表达和评估数学表达式的一种方式。
例如,这是一个简单的数学方程式 p=x+y,我们可以如下绘制上述等式的计算图。
在这里插入图片描述
上述计算图具有加法节点(具有“+”符号的节点),其具有两个输入变量x和y以及一个输出q。

pytorch与tensorflow的区别

  1. pytorch相对于tensorflow出现的较晚一些,主要是针对深度神经网络而开发出来,这几年发展也是十分不错;tensorflow出现的较早,它的优点是分布式计算,在面临较大数据时相对效率较高;
  2. pytorch是动态框架,tensorflow是静态框架,主要区别就是静态框架在构建计算图的时候提前构建好,之后则无法改变,固定了计算的流程,势必带来了不灵活性,如果我们要改变计算的逻辑,或者随着时间变化的计算逻辑,这样的动态计算TensorFlow是实现不了的;而动态框架可以根据具体计算情况进行改变
  3. tensorflow的库相对完备齐全,而pytorch还在完善中;所以tensorflow在可视化方面十分出色;
  4. pytorch对python十分友好,更加python化的框架,而tensorflow的话更加像独立的语言和框架

pytorch包含的内容

  1. overview
    pytorch 由低层到上层主要有三大块功能模块,如下图所示
    在这里插入图片描述
    1.1 张量计算引擎(tensor computation)
    Tensor 计算引擎,类似 numpy 和 matlab,基本对象是tensor(类比 numpy 中的 ndarray 或 matlab 中的 array)。除提供基于 CPU 的常用操作的实现外,pytorch 还提供了高效的 GPU 实现,这对于深度学习至关重要。
    1.2 自动求导机制(autograd)
    由于深度学习模型日趋复杂,因此,对自动求导的支持对于学习框架变得必不可少。pytorch 采用了动态求导机制,使用类似方法的框架包括: chainer,dynet。作为对比,theano,tensorflow 采用静态自动求导机制。
    1.3 神经网络的高层库(NN)
    pytorch 还提供了高层的。对于常用的网络结构,如全连接、卷积、RNN 等。同时,pytorch 还提供了常用的、optimizer 及参数。
  2. 自定义 Module
    2.1 Function
    Function 是 pytorch 自动求导机制的核心类。Function 是无参数或者说无状态的,它只负责接收输入,返回相应的输出;对于反向,它接收输出相应的梯度,返回输入相应的梯度。
    2.2 Module
    类似于 Function,Module 对象也是 callable ,输入和输出也是 Variable。不同的是,Module 是[可以]有参数的。Module 包含两个主要部分:参数及计算逻辑(Function 调用)。由于ReLU激活函数没有参数,这里我们以最基本的全连接层为例来说明如何自定义Module。

pytorch常用模块

在这里插入图片描述
和数值相关的:Tensor、Variable、Parameter
Tensor:
PyTorch中的计算基本都是基于Tensor的,可以说是PyTorch中的基本计算单元。
Variable:
Tensor的一个Wrapper,其中保存了Variable的创造者,Variable的值(tensor),还有Variable的梯度(Variable)。自动求导机制的核心组件,因为它不仅保存了 变量的值,还保存了变量是由哪个op产生的。这在反向传导的过程中是十分重要的。
Variable的前向过程的计算包括两个部分的计算,一个是其值的计算(即,Tensor的计算),还有就是Variable标签的计算。标签指的是什么呢?如果您看过PyTorch的官方文档 Excluding subgraphs from backward 部分的话,您就会发现Variable还有两个标签:requires_grad和volatile。标签的计算指的就是这个。
Parameter:
这个类是Variable的一个子集,PyTorch给出这个类的定义是为了在Module(下面会谈到)中添加模型参数方便。

模型相关的:Function、Module
Function:
如果您想在PyTorch中自定义OP的话,您需要继承这个类,您需要在继承的时候复写forward和backward方法,可能还需要复写__init__方法(由于篇幅控制,这里不再详细赘述如果自定义OP)。您需要在forward中定义OP,在backward说明如何计算梯度。
关于Function,还需要知道的一点就是,Function中forward和backward方法中进行计算的类型都是Tensor,而不是我们传入的Variable。计算完forward和backward之后,会包装成Varaible返回。这种设定倒是可以理解的,因为OP是一个整体嘛,OP内部的计算不需要记录creator
Module:
这个类和Function是有点区别的,回忆一下,我们定义Function的时候,Funciton本身是不需要变量的,而Module是变量和Function的结合体。在某些时候,我们更倾向称这种结构为Layer。但是这里既然这么叫,那就这么叫吧。
Module实际上是一个容器,我们可以继承Module,在里面加几个参数,从而实现一个简单全连接层。我们也可以继承Module,在里面加入其它Module,从而实现整个VGG结构。

二、Pytorch算料源码解读
1、DataSet源码部分解读
2、DataLoader源码解读
3、Sample源码解读
4、collect源码解读
5、数据集源码解读
三、Pytorch算法源码解读
1、tensor源码解读
2、network源码解读
3、norm源码解读
4、activateFunc源码解读
5、loss源码解读
6、metric源码解读
四、Pytorch优化源码解读
1、优化器源码解读
2、学习率调度器源码解读
3、调试回调源码解读
五、Pytorch并行源码解读
1、DataParallel源码解读
2、DistributedDataParallel源码解读
3、并行通信源码解读
六、Pytorch压缩源码解读
1、蒸馏源码解读
2、剪枝源码解读
3、量化源码解读
4、NSA源码解读
七、Pytroch网络图优化源码解读
1、Jit源码解读
2、compiler源码解读
八、基于Pytorch框架的优秀模型源码解读
1、Yolo系列源码解读
2、NLP注意力机制系列源码解读
3、CV注意力机制系列源码解读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 20:14:01       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 20:14:01       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 20:14:01       4 阅读
  4. Python语言-面向对象

    2024-07-10 20:14:01       7 阅读

热门阅读

  1. 设计模式——原型模式

    2024-07-10 20:14:01       12 阅读
  2. grblHAL的代码学习笔记和解读

    2024-07-10 20:14:01       11 阅读
  3. Spring Boot中的多租户架构实现

    2024-07-10 20:14:01       11 阅读
  4. 单链表的学习与基础运用p

    2024-07-10 20:14:01       15 阅读
  5. 如何正确使用Redisson实现分布式锁

    2024-07-10 20:14:01       9 阅读
  6. 开源软件项目的崛起:机遇、挑战与个人成长

    2024-07-10 20:14:01       7 阅读
  7. Electron 跨平台桌面应用开发工具

    2024-07-10 20:14:01       9 阅读
  8. 【linux】linux的特殊符号

    2024-07-10 20:14:01       7 阅读
  9. Rust:常见 GUI 框架

    2024-07-10 20:14:01       11 阅读