这篇博客将介绍PyTorch深度学习库,包括:
- PyTorch是什么
- 如何安装PyTorch
- 重要的PyTorch功能,包括张量和自动标记
- PyTorch如何支持GPU
- 为什么PyTorch在研究人员中如此受欢迎
- PyTorch是否优于Keras/TensorFlow
- 是否应该在项目中使用PyTorch或Keras/TensorFlow
1. PyTorch是什么
PyTorch是一个开源机器学习库,专门从事张量计算、自动微分和GPU加速(tensor computations, automatic differentiation, and GPU acceleration)。与Keras和TensorFlow竞争“最常用”深度学习包奖,PyTorch是最受欢迎的深度学习库之一。
PyTorch由于其python特性和易扩展性(即实现自定义层类型、网络架构等),在研究社区中尤其流行。
在这篇博客将讨论PyTorch深度学习库的基础知识。从下周开始,您将获得使用PyTorch训练神经网络、执行图像分类以及将对象检测应用于图像和实时视频的实际操作经验。
PyTorch基于Torch,这是Lua的科学计算框架。在PyTorch和Keras/TensorFlow之前,Caffe和Torch等深度学习软件包往往最受欢迎。随着深度学习开始彻底改变计算机科学的几乎所有领域,开发人员和研究人员希望有一个高效、易于使用的库来用Python编程语言构建、训练和评估神经网络。
Python和R是数据科学家和机器学习领域最流行的两种编程语言,因此研究人员自然希望在Python生态系统中使用深入学习算法。
2015年3月,谷歌人工智能研究员François Chollet开发并发布了Keras,这是一个开源库为训练神经网络提供了Python API。Keras很快受到欢迎,因为它易于使用的API模拟了scikit learn(Python的事实上的标准机器学习库)的工作方式。
2015年11月,谷歌发布了TensorFlow v1.x。TensorFlow不仅成为Keras库的默认后端/引擎,而且还实现了一些较低级别的功能,这些功能是高级深度学习从业者和研究人员创建最先进的网络和进行新颖研究所需的。然而,有一个问题-TensorFlow v1.x API不是很Pythonic,也不是很直观和易于使用。为了解决这个问题,2016年9月发布了由Facebook赞助、Yann LeCun(现代神经网络复兴的祖父之一,也是Facebook的人工智能研究员)支持的PyTorch。
PyTorch解决了研究人员对Keras和TensorFlow的许多问题。虽然Keras非常易于使用,但就其本质和设计而言,Keras并没有公开研究人员所需的一些低级功能和定制。另一方面,TensorFlow当然可以访问这些类型的函数,但它们不是Pythonic函数,而且通常很难梳理TensorFlow文档来找出所需的函数。简而言之,Keras没有提供研究人员所需的低级API,TensorFlow的API也不那么友好。
PyTorch通过创建一个Pythonic且易于定制的API解决了这些问题,允许实现新的层类型、优化器和新的体系结构。研究小组慢慢地开始接受PyTorch,从TensorFlow转变过来。这就是为什么今天有那么多研究人员在实验室里使用PyTorch的原因。
PyTorch1.x和TensorFlow2.x都实现了基本相同的功能,并提供了API和函数调用来完成相同的任务。
2. 如何安装PyTorch
pip install torch torchvision
python
>>> import torch
>>> torch.__version__
'1.8.1'
>>>
3. 重要的PyTorch功能,包括张量和自动标记
PyTorch将数据表示为称为张量的多维、类似NumPy的数组。张量存储神经网络的输入、隐藏层表示和输出。
scalar、vector、matrix、tensor
0维标量、1维矢量、2维矩阵、3维/多维张量
PyTorch可以从张量动态生成一个图,然后在其上应用自动微分:
自动微分(torch.autograd)使得使用PyTorch训练神经网络变得非常容易:
- 组装神经网络图
- 执行向前传递(即进行预测)
- 计算损失/错误
- 向后遍历网络(即反向传播)并调整网络参数,以便(理想情况下)根据计算的损耗/输出做出更准确的预测
反向传播始终是手动执行的最繁琐和最耗时的步骤。幸运的是,PyTorch自动完成了这一步。
Keras用户通常调用model.fit而TensorFlow用户使用GradientTape类来训练网络。PyTorch要求手动实现训练循环,torch.autograd是一个巨大的帮助。感谢PyTorch开发人员实现了自动微分。
4. PyTorch如何支持GPU
PyTorch库主要支持基于NVIDIA CUDA的GPU。GPU加速可以在很短的时间内训练神经网络。
此外,PyTorch还支持分布式培训。
5. 为什么PyTorch在研究人员中如此受欢迎
2016年(PyTorch发布时)至2019年(TensorFlow 2.x正式发布之前),PyTorch在研究界站稳了脚跟。
PyTorch能够获得这一立足点的原因有很多,但主要原因是:
- Keras虽然非常容易使用,但并没有提供研究人员进行新型深度学习研究所需的低级功能。同时Keras让研究人员很难实现自己的自定义优化器、层类型和模型架构
- TensorFlow 1.x确实提供了这种低级访问和自定义实现;然而API很难使用,而且不是很Pythonic.
- PyTorch尤其是其autograd支持,帮助解决了TensorFlow 1.x 的许多问题。使研究人员更容易实现自己的自定义方法。此外,PyTorch为深度学习实践者提供了对培训循环的完全控制。
事物都有俩面性,Keras使得使用单个模型调用来训练神经网络变得非常简单model.fit,类似于在scikit learn中训练标准机器学习模型的方式。缺点是研究人员无法(轻易)修改这个模型。所以必须使用TensorFlow的低级函数。但这些方法并不容易实施。
PyTorch解决了这个问题,从完全控制的意义上说,这是好的,但坏的是PyTorch可以轻松地击中自己的脚(以前每个PyTorch用户都忘记了将梯度归零)。
PyTorch 1.x和TensorFlow 2.x API实现了非常相似的特性,它们只是以不同的方式进行,有点像学习一种编程语言与另一种编程语言。每种编程语言都有其优点,但都实现了相同类型的语句和控件(即“if”语句、“for”循环等)。
6. PyTorch是否优于Keras/TensorFlow
Keras/TensorFlow有特定的用途,就像PyTorch一样。
就像不会笼统地说Java明显优于Python。在处理机器学习和数据科学时,有一个强有力的论据是Python优于Java。但是,如果打算开发在多个体系结构上运行的高可靠性企业应用程序,那么Java可能是更好的选择。
不要陷入关于PyTorch或Keras/TensorFlow是否“更好”的争论中——这两个库都实现了非常相似的功能,只是使用了不同的函数调用和不同的训练范式。
如果你是一个深度学习的初学者,只需选择一个并学习它。无论使用PyTorch还是Keras/TensorFlow,深度学习的基础都是一样的。
7. 是否应该在项目中使用PyTorch或Keras/TensorFlow
在Keras/TensorFlow和PyTorch之间进行选择并不需要做出笼统的陈述,例如:
如果在做研究,建议使用PyTorch。
如果是初学者,建议使用Keras。
如果正在开发行业应用程序,请使用TensorFlow和Keras。
PyTorch/Keras和TensorFlow之间的许多特性集是聚合的,它们都包含本质上相同的特性集,只是以不同的方式实现。
Keras最适合教授初露头角的深度学习实践者,Keras是快速构建和部署深度学习模型的最佳选择。
PyTorch确实让更高级的实践者更容易实现定制的培训循环、层类型和体系结构。随着TensorFlow 2.x API的发布,这有所降低但它仍然值得一提。
参考
- https://pyimagesearch.com/2021/07/05/what-is-pytorch/
- https://pytorch.org/get-started/locally/
- Windows 支持的PyTorch https://download.pytorch.org/libtorch/cpu/libtorch-win-shared-with-deps-1.11.0%2Bcpu.zip