首先声明下,这篇博客不是讲解 Pytorch 内部细节的文章,更多的是宏观上的讲解,希望读者可以站在 前人的肩膀上看清 Pytorch框架组成,同时希望读者可以走的更远
文章目录
- 1、Pytorch 核心模块
- 1.1 torch 模块
- 1.2 torch.Storage
- 1.3 torch.Tensor 张量
- torch.tensor & torch.Tensor
- Variable (已抛弃)
- 1.4 torch.nn
- 1.5 torch.nn.init 权重初始化
- 1.6 torch.nn.functional 函数模块
- 1.7 torch.optim 优化器
- 1.8 torch.cuda GPU加速
- 1.9 torch.autograd 自动微分算法
- 1.10 torch.distributed 分布式计算
- 1.11 torch.hub 预训练模型
- 1.12 torch.jit 即时编译器
- 1.13 torch.multiprocessing 多进程
- 1.14 torch.random 随机数
- 1.15 torch.onnx 开放神经网络交换格式
- 2、torch.utils 辅助模块
- 2.1 torch.utils.data
- 2.2 torch.utils.tensorboard
- 3、torchvision
- 3.1 torchvision.datasets
- 3.2 torchvision.models
深度学习算法是高度结构化的,在使用过程中并不需要从头开始构造一个深度学习模型的代码。为了方便算法的实现,设计人员开发出深度学习框架,通过将深度学习算法和模型抽象成张量的一系列计算,并把计算涉及的一些算法抽象成应用程序接口供用户使用,从而可以快速实现各种各样的深度学习算法。
虽然深度学习框架的种类很多,但是每个种类又有不同的功能,但是从本质上说,所有的深度学习框架都要支持一些基本的功能,并且通过组合使用可以构建更复杂的神经网络模型。
1、Pytorch 核心模块
1.1 torch 模块
torch 模块本身包含了 Pytorch 很多经常使用的激活函数,以及 Tensor的一些操作,另外还有一类函数能够能够产生一定形状的张量。
1.2 torch.Storage
负责 torch.Tensor 底层的数据存储。
假设一个 维张量,它的维度是 ,由于计算机的内存是连续的地址空间,所以在实际存储过程中存储的是 维的向量,这个向量在内存中的大小为 。其中 为高纬,
实际数值的排列方式可以从两个方向开始:
- 从 到
- 从 到
一般选择从 这个维度开始,从小到大排列这个向量,即先填充满 的维度,在逐渐填满 ,直到
1.3 torch.Tensor 张量
Pytorch 命名规则:
如果张量方法后缀带下划线,则该方法会修改张量本身的数据 Tensor.add_
如果张量方法后缀没有下划线,则该方法会返回一个新的张量 Tensor.add
- 16位整型 torch.ShortTensor
- 32位整型 torch.IntTensor
- 64位整型 torch.LongTensor
- 16位浮点型 torch.HalfTensor
- 32位浮点型 torch.FloatTensor
- 64位浮点型 torch.DoubleTensor
- torch.Tensor 默认 torch.FloatTensor
torch.tensor & torch.Tensor
- torch.tensor() 只接收数据,且使用之前需要初始化,默认参数不确定,变化比较大
- torch.Tensor() 接收 shape,接收数据时需要是 list[ ] 格式
常用属性
- a.dim() 维度(Dimension)
维度:2 - .size & .shape
大小:[2,2] - .Tensor
张量:[1,2;3,4] - .numel
指 tensor 元素的个数
Variable (已抛弃)
Pytorch 在 0.4版本中 实现了 Tensor 与 Variable 的合并,在此之前的版本中,这两个概念是相互独立的,变量是可以构建计算图且能够进行自动求导的张量。
在 Pytorch 0.4版本中,通过指定张量支持导数的选项,便不再需要用到 Variable。
torch.tensor( data , requires_grad=True )
1.4 torch.nn
torch.nn 模块是一个非常重要的模块,是 Pytorch 神经网络模块化的核心,这个模块定义了一系列模块,
- 包含了 卷积层(nn.ConvNd)、线性层(nn.Linear)等等。
- 另外 torch.nn 中也定义了一系列的损失函数。
当构建深度学习模型的时候,可以通过继承 nn.Module 类并重写 forward方法来实现一个新的神经网络。一般来说,torch.nn 里定义的神经网络模块都含有参数,可以对这些参数使用优化器进行训练。
1.5 torch.nn.init 权重初始化
定义了 神经网络权重的初始化。神经网络权重的初始值对神经网络的训练以及模型收敛有很大程度的影响。如果初始的权重取值不合适,重则导致后续的优化过程收敛很慢,甚至不收敛。
这个模块中的函数就是为了解决神经网络权重的初始化问题,其中使用了很多初始化方法
- 包含了均匀初始化 torch.nn.init.uniform_ 、正态分布归一化torch.nn.init.normal等
注意!
根据 Pytorch命名规则,如果以下划线结尾,则这个方法会直接改变作用张量的值,因此,这些方法会直接改变传入张量的值,同时会返回改变后的张量。
1.6 torch.nn.functional 函数模块
torch.nn.functional 是Pytorch 的函数模块,定义了一些和神经网络相关的函数,包含了
- 卷积函数
- 池化函数
- 不常用的激活函数
注意!
torch.nn 中定义的模块一般会调用 torch.nn.functional 里的函数,比如 nn.ConvNd模块会调用 nn.functional.convNd 函数。
1.7 torch.optim 优化器
torch.optim 定义了一系列的优化器
- torch.optim.SGD 随机梯度下降算法
- torch.optim.Adagrad
- torch.optim.RMSprop
- torch.optim.Adam
- torch.optim.lr_scheduler 学习率衰减算法
- 等
1.8 torch.cuda GPU加速
torch.cuda.is_available() # 判断设备是否支持GPU
torch.cuda 模块定义了与 CUDA运算相关的一系列函数,包括
- 检查系统 CUDA 是否可用
- 当前进程对应的 GPU序号
- 清除 GPU上的缓存
- 设置 GPU的计算流(Stream)
- 同步 GPU上执行的所有核函数(Kernel)
1.9 torch.autograd 自动微分算法
torch.autograd 模块是 Pytorch 的自动微分算法模块,定义了一系列的自动微分函数
- torch.autograd.backward 函数,主要用于在求得损失函数之后进行反向梯度传播
- torch.autograd.grad 函数,用于一个标量对另一个张量求导,以及在代码中设置不参与求导的部分
- 等
1.10 torch.distributed 分布式计算
torch.distributed 是Pytorch 的分布式计算模块,主要功能是提供 Pytorch并行运行环境,其主要支持的后端有 MPI、Gloo、NCCL 三种。
Pytorch 的分布式工作原理主要是启动多个并行的进程,每个进程都拥有一个模型的备份,然后输入不同的训练数据到多个并行的进程,计算损失函数,每个进程独立地做反向传播,最后对所有进程权重张量的梯度做 归约(Reduce)。
用到后端的部分主要是数据的广播和数据的收集,其中前者是把数据从一个节点(进程)传播到另一个节点(进程)。Pytorch 的分布式计算模块不但提供了后端的一个包装,还提供了一些启动方式来启动多个进程,包括但不限于网络、共享文件等。
1.11 torch.hub 预训练模型
torch.hub 提供了一系列预训练的模型供用户使用。可以通过 torch.hub.list 函数来获取某个模型镜像站点的模型信息。通过 torch.hub.load 来载入预训练的模型,载入后的模型支持保存到本地。
1.12 torch.jit 即时编译器
torch.jit 是 Pytorch的即时编译器,这个模块存在的意义是:把 Pytorch 的动态图转换成可以优化和序列化的静态图,其主要工作原理是通过输入预先定义好的张量,追踪整个动态图的构建过程,得到最终构建出来的动态图,得到最终构建出来的动态图,然后转化为静态图。
通过 JIT 得到的静态图可以保存,并且被 Pytorch 其他的前端支持。另外, JIT 也可以用来生成其他格式的神经网络描述文件。
需要注意的一点是: torch.jit 支持两种模式:
- 脚本模式
- 追踪模式
前者和后者都能构成静态图,区别在于前者支持控制流,后者不支持,但是前者支持的神经网络模块比后者少。
1.13 torch.multiprocessing 多进程
torch.multiprocessing 定义了 Pytorch 中的多进程 API,通过使用这个模块,可以启动不同的进程,每个进程运行不同的深度学习模型,并且能够在进程间共享张量。共享的张量可以在 CPU上,也可以在 GPU上,多进程 API还提供了 与 Python原生的多进程 API相同的一系列函数,包括 Lock & Queue等。
1.14 torch.random 随机数
torch.random 提供了一系列的方法来保存和设置随机数生成器的状态。因为神经网络的训练是一个随机的过程,包括数据的输入、权重的初始化都具有一定的随机性。设置一个统一的随机种子可以有效地帮助我们不同结构神经网络的表现,有助于调试神经网络的结构。
1.15 torch.onnx 开放神经网络交换格式
torch.onnx 定义了 Pytorch 导出和加载 ONNX格式的深度学习模型描述文件。ONNX 格式的存在是为了方便不同深度学习框架之间交换模型。引入这个模块可以方便 Pytorch导出模型给其他深度学习框架使用,或者让 Pytorch可以载入其他深度学习框架构建的深度学习模型。
2、torch.utils 辅助模块
torch.utils 提供了一些列的辅助模块
2.1 torch.utils.data
torch.utils.data 引入了 数据集(Dataset)和数据加载起(DataLoader)的概念。
- Dataset 包含了所有数据的数据集,通过索引能够得到某一条特定的数据;
- DataLoader 通过对数据集的包装,可以对数据集进行随机排列(Shuffle)&采样(Sample),得到一系列打乱数据顺序的 小批量数据(BatchSize)
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0,
collate_fn=None,pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None)
2.2 torch.utils.tensorboard
Tensorboard 最初是 TensorFlow自带的数据可视化工具,能够显示深度学习模型在训练过程中损失函数、张量权重的直方图,以及模型训练过程中输出的图像等信息。Tensorboard 的功能非常强大,而且是基于可交互的动态网页设计的,可以通过预先提供的一系列功能来输出特定的训练过程的细节。
Pytorch 支持 Tensorboard 可视化之后,在 Pytorch 的训练过程中,可以很方便地观察中间输出的张量,也可以方便的调试深度学习模型。
3、torchvision
包含了目前流行的数据集、计算机视觉的模型 和 常用的图片转换工具。
3.1 torchvision.datasets
torchvision.datasets中包含了以下数据集
- MNIST
- COCO(用于图像标注和目标检测)(Captioning and Detection)
- LSUN Classification
- ImageFolder
- Imagenet-12
- CIFAR10 and CIFAR100
- STL10
3.2 torchvision.models
torchvision.models模块的 子模块中包含以下模型结构。
- AlexNet
- VGG
- ResNet
- InceptionNet
- DenseNet