首先声明下,这篇博客不是讲解 Pytorch 内部细节的文章,更多的是宏观上的讲解,希望读者可以站在 前人的肩膀上看清 Pytorch框架组成,同时希望读者可以走的更远
更多关于 Pytorch 的博文,有兴趣的小伙伴可以关注我的 Pytorch专栏
深度学习算法是高度结构化的,在使用过程中并不需要从头开始构造一个深度学习模型的代码。为了方便算法的实现,设计人员开发出深度学习框架,通过将深度学习算法和模型抽象成张量的一系列计算,并把计算涉及的一些算法抽象成应用程序接口供用户使用,从而可以快速实现各种各样的深度学习算法。
虽然深度学习框架的种类很多,但是每个种类又有不同的功能,但是从本质上说,所有的深度学习框架都要支持一些基本的功能,并且通过组合使用可以构建更复杂的神经网络模型。
torch 模块本身包含了 Pytorch 很多经常使用的激活函数,以及 Tensor的一些操作,另外还有一类函数能够能够产生一定形状的张量。
负责 torch.Tensor 底层的数据存储。
假设一个 k k k 维张量,它的维度是 ( n 1 , n 2 , . . . , n k ) (n_1,n_2,...,n_k) (n1,n2,...,nk) ,由于计算机的内存是连续的地址空间,所以在实际存储过程中存储的是 1 1 1维的向量,这个向量在内存中的大小为 n 1 × n 2 × . . . × n k n_1 \times n_2 \times ... \times n_k n1×n2×...×nk 。其中 n 1 n_1 n1 为高纬, n k n_k nk 为低维。
实际数值的排列方式可以从两个方向开始:
一般选择从 n k n_k nk 这个维度开始,从小到大排列这个向量,即先填充满 n k n_k nk 的维度,在逐渐填满 n k − 1 n_{k-1} nk−1 ,直到 n 1 n_1 n1 的维度。
Pytorch 命名规则:
如果张量方法后缀带下划线,则该方法会修改张量本身的数据 Tensor.add_
如果张量方法后缀没有下划线,则该方法会返回一个新的张量 Tensor.add
常用属性
Pytorch 在 0.4版本中 实现了 Tensor 与 Variable 的合并,在此之前的版本中,这两个概念是相互独立的,变量是可以构建计算图且能够进行自动求导的张量。
在 Pytorch 0.4版本中,通过指定张量支持导数的选项,便不再需要用到 Variable。
torch.tensor( data , requires_grad=True )
torch.nn 模块是一个非常重要的模块,是 Pytorch 神经网络模块化的核心,这个模块定义了一系列模块,
当构建深度学习模型的时候,可以通过继承 nn.Module 类并重写 forward方法来实现一个新的神经网络。一般来说,torch.nn 里定义的神经网络模块都含有参数,可以对这些参数使用优化器进行训练。
定义了 神经网络权重的初始化。神经网络权重的初始值对神经网络的训练以及模型收敛有很大程度的影响。如果初始的权重取值不合适,重则导致后续的优化过程收敛很慢,甚至不收敛。
这个模块中的函数就是为了解决神经网络权重的初始化问题,其中使用了很多初始化方法
注意!
根据 Pytorch命名规则,如果以下划线结尾,则这个方法会直接改变作用张量的值,因此,这些方法会直接改变传入张量的值,同时会返回改变后的张量。
torch.nn.functional 是Pytorch 的函数模块,定义了一些和神经网络相关的函数,包含了
注意!
torch.nn 中定义的模块一般会调用 torch.nn.functional 里的函数,比如 nn.ConvNd模块会调用 nn.functional.convNd 函数。
torch.optim 定义了一系列的优化器
torch.cuda.is_available() # 判断设备是否支持GPU
torch.cuda 模块定义了与 CUDA运算相关的一系列函数,包括
torch.autograd 模块是 Pytorch 的自动微分算法模块,定义了一系列的自动微分函数
torch.distributed 是Pytorch 的分布式计算模块,主要功能是提供 Pytorch并行运行环境,其主要支持的后端有 MPI、Gloo、NCCL 三种。
Pytorch 的分布式工作原理主要是启动多个并行的进程,每个进程都拥有一个模型的备份,然后输入不同的训练数据到多个并行的进程,计算损失函数,每个进程独立地做反向传播,最后对所有进程权重张量的梯度做 归约(Reduce)。
用到后端的部分主要是数据的广播和数据的收集,其中前者是把数据从一个节点(进程)传播到另一个节点(进程)。Pytorch 的分布式计算模块不但提供了后端的一个包装,还提供了一些启动方式来启动多个进程,包括但不限于网络、共享文件等。
torch.hub 提供了一系列预训练的模型供用户使用。可以通过 torch.hub.list 函数来获取某个模型镜像站点的模型信息。通过 torch.hub.load 来载入预训练的模型,载入后的模型支持保存到本地。
torch.jit 是 Pytorch的即时编译器,这个模块存在的意义是:把 Pytorch 的动态图转换成可以优化和序列化的静态图,其主要工作原理是通过输入预先定义好的张量,追踪整个动态图的构建过程,得到最终构建出来的动态图,得到最终构建出来的动态图,然后转化为静态图。
通过 JIT 得到的静态图可以保存,并且被 Pytorch 其他的前端支持。另外, JIT 也可以用来生成其他格式的神经网络描述文件。
需要注意的一点是: torch.jit 支持两种模式:
前者和后者都能构成静态图,区别在于前者支持控制流,后者不支持,但是前者支持的神经网络模块比后者少。
torch.multiprocessing 定义了 Pytorch 中的多进程 API,通过使用这个模块,可以启动不同的进程,每个进程运行不同的深度学习模型,并且能够在进程间共享张量。共享的张量可以在 CPU上,也可以在 GPU上,多进程 API还提供了 与 Python原生的多进程 API相同的一系列函数,包括 Lock & Queue等。
torch.random 提供了一系列的方法来保存和设置随机数生成器的状态。因为神经网络的训练是一个随机的过程,包括数据的输入、权重的初始化都具有一定的随机性。设置一个统一的随机种子可以有效地帮助我们不同结构神经网络的表现,有助于调试神经网络的结构。
torch.onnx 定义了 Pytorch 导出和加载 ONNX格式的深度学习模型描述文件。ONNX 格式的存在是为了方便不同深度学习框架之间交换模型。引入这个模块可以方便 Pytorch导出模型给其他深度学习框架使用,或者让 Pytorch可以载入其他深度学习框架构建的深度学习模型。
torch.utils 提供了一些列的辅助模块
torch.utils.data 引入了 数据集(Dataset)和数据加载起(DataLoader)的概念。
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)
Tensorboard 最初是 TensorFlow自带的数据可视化工具,能够显示深度学习模型在训练过程中损失函数、张量权重的直方图,以及模型训练过程中输出的图像等信息。Tensorboard 的功能非常强大,而且是基于可交互的动态网页设计的,可以通过预先提供的一系列功能来输出特定的训练过程的细节。
Pytorch 支持 Tensorboard 可视化之后,在 Pytorch 的训练过程中,可以很方便地观察中间输出的张量,也可以方便的调试深度学习模型。
包含了目前流行的数据集、计算机视觉的模型 和 常用的图片转换工具。
torchvision.datasets中包含了以下数据集
torchvision.models模块的 子模块中包含以下模型结构。