本系列文章会优先发布于微信公众号和知乎,欢迎大家关注
微信公众号:小飞怪兽屋
目录
本系列的目的
平时工作中经常会用到PyTorch, 但由于工作性质,往往只停留在PyTorch的应用层面。某天突发奇想想研究学习下PyTorch的架构以及底层源码,毕竟做为一名算法工程师,算法能力和工程能力相辅相成,缺少工程能力的算法能力如空中楼阁,华而不实。无意中发现网上关于PyTorch源码的相关介绍非常少,很多都浅尝辄止,有的也仅仅介绍了部分Python源码。于是就创建了这一系列来记录自己的学习过程,同时也鞭策自己可以将这个系列一直写下去。哈哈~ 磨刀不误砍柴工,学习的目的也是为了更多的工作产出。
PyTorch是什么?
PyTorch是当下最流行的开源深度学习框架之一。由于其简单易用性,深受广大科研工作者的喜爱。其前身是一个以Lua语言为主的Torch项目。在2016年,Meta(原Facebook)公司基于Torch开发了基于Python的PyTorch框架,并于2017年1月将其开源。在2022年9月12日,Meta公司宣布将PyTorch项目归入Linux基金会旗下的PyTorch基金会管理。
PyTorch本身是一个Python扩展包,按照官方说法它主要具有以下两种特色:
-
支持GPU加速的张量(Tensor)计算
-
在一个类似磁带(前向和反向)的梯度自动计算(Autograd)系统上搭建深度神经网络
Tensor其实本质上就是一个多维数组。在数学上单个数据我们称之为标量,一维数据我们称之为向量,二维数据我们称之为矩阵。GPU就是图形处理单元,也就是我们平时说的显卡。它的优势在于它比CPU具有更快的浮点数运算能力,在游戏,科学计算,深度学习领域都有广泛的应用场景。
如果PyTorch仅是支持GPU加速的Tensor计算框架,那它也就是NumPy的替代品而已。其最核心的功能就是Autograd系统,目前深度学习就是基于梯度反向传播理论来达到网络的自我训练。PyTorch的Autograd系统是创建了一个动态的计算图,用户只需要关注前向计算网络搭建,PyTorch会自动根据动态计算图去反向计算梯度并更新网络权重。
在设计之初PyTorch并没打算仅成为一个绑定C++框架的Python包,它紧密地将C++框架集成到python中。你可以在使用PyTorch的同时也结合使用NumPy/SciPy/scikit-learn这些优秀的科学计算包,同时你也可以用Python编写你自己的神经网络层(PyTorch神经网络相关的代码基本上都是Python编写)。
基于以上特性,你可以很容易地通过PyTorch来快速实现自己的深度学习网络,并且PyTorch的代码调试也非常直观。正如前面所说,PyTorch的计算图是动态的,当你写下一行Python代码的时候你就可以直接运行得到结果。对用户来说,PyT