掌握深度学习,为什么要用PyTorch、TensorFlow框架?
点击下方卡片,关注“新机器视觉”公众号
重磅干货,第一时间送达
【导读】
如果你需要深度学习模型,那么 PyTorch 和 TensorFlow 都是不错的选择。
并非每个回归或分类问题都需要通过深度学习来解决。甚至可以说,并非每个回归或分类问题都需要通过机器学习来解决。毕竟,许多数据集可以用解析方法或简单的统计过程进行建模。
另一方面,在某些情况下,深度学习或深度迁移学习可以帮助你训练更准确的模型。在这些情况下,你可以考虑使用 PyTorch 和 TensorFlow ,特别是如果你所需的训练模型与其中一个框架模型库中的模型类似。
【PyTorch】
PyTorch 建立在旧版的 Torch 和 Caffe2 框架之上。如其名所示,PyTorch采用了脚本语言 Python,并利用改版后的Torch C/CUDA作为后端。PyTorch 项目还融入了 Caffe2 的生产功能。
PyTorch 被称为“拥有强大 GPU 加速功能的 Python 版 Tensor 和动态神经网络。”这意味着什么?
Tensor(张量)是一种物理学和工程学中广泛使用的数学结构。2 阶的 Tensor 是一种特殊的矩阵;而对向量和张量取内积就可以得到另一个拥有新长度和新方向的向量。TensorFlow 这个名字就来自张量在其网络模型中流动的方式。NumPy 也用到了 Tensor,名为 ndarray 。
GPU 加速是大多数现代深度神经网络框架的基础。动态神经网络是一种特殊的神经网络,每次迭代都会发生变化,例如,PyTorch 模型可以在训练期间通过添加和删除隐藏层,来提高其准确性和通用性。
PyTorch 会在每个迭代中实时重建计算图。相比之下,在默认情况下TensorFlow 会创建一个计算图,优化图代码以提高性能,然后训练模型。
虽然急切执行模式在 TensorFlow 中刚刚出现,但其是 PyTorch 唯一的运行方式:API 在被调用时会立即执行,而不会被添加到计算图稍后再运行。这样可能看起来计算效率会低一些,但是 PyTorch 设计的工作方式就是如此,而且实际上在训练或预测速度方面并不逊色。
PyTorch 通过集成加速库,比如英特尔 MKL、Nvidia cuDNN 和 NCCL 等,最大限度地提升速度。其核心CPU、GPU Tensor和神经网络后端TH(Torch)、THC(Torch CUDA)、THNN(Torch神经网络)和THCUNN(Torch CUDA神经网络)等,都是使用 C99 API 编写的单独库。同时,PyTorch 并不是整体式 C++ 框架的 Python 绑定。其目的是与Python 深度集成,并允许使用其他 Python 库。
【Fast.ai与fastai库】
Fast.ai 是一家小公司,他们通过为编程人员提供免费课程、软件库、尖端研究和社区,降低深度学习的难度,并吸引更多各种背景的人。
fastai 库基于 PyTorch,通过现代化的最佳实践简化了快速准确的神经网络训练。它基于对 Fast.ai 深度学习最佳实践的研究,提供了包括视觉、文本、表格和协作(协作过滤)模型在内的“开箱即用”支持。
fastai 库与 PyTorch 的关系非常类似于 Keras 与 TensorFlow 。但明显的区别在于,PyTorch 没有正式支持 fastai 。
【TensorFlow】
TensorFlow 是众多优秀的机器学习和深度学习框架中最成熟的一个,也是研究论文中引用最多的一个(即使不算来自谷歌员工的引用也是第一),而且在生产中的使用效果也很好。它可能不是最容易学习的框架,但随着 TensorFlow 2的到来,TensorFlow 的门槛也没有 2016 年那般高了。TensorFlow 是许多 Google 服务的基础。
TensorFlow 2.0 官网对该项目的描述为:“端到端的开源机器学习平台。”,谷歌通过“平台”提供了一个包含工具、库以及社区资源的全方位生态系统,研究人员可以利用这个平台“推动机器学习达到最高水准”,而开发人员则可以利用这个平台轻松构建和部署基于 AI 的应用程序。
TensorFlow 2.0 有四个主要部分组成:
TensorFlow 核心,一个用于开发和培训机器学习模型的开源库;
TensorFlow.js,一个在 Web 浏览器和 Node.js 上训练和部署模型的 JavaScript库;
TensorFlow Lite,一个轻量级库,用于在移动和嵌入式设备上部署模型;
TensorFlow Extended,是一个端到端平台,用于在大型生产环境中准备数据、培训、验证和部署模型。
TensorFlow 2.0 的重点放在了简单性和易用性上,其这个版本拥有一系列的新功能,包括急切执行、直观的高级 API 以及可以在任何平台上构建模型等。急切执行意味着 TensorFlow 代码定义好就可以运行,而 TensorFlow 最初的模式需要将节点和边添加到计算图中,稍后再在会话中运行。
高效地使用 TensorFlow 2.0 方法是,使用高级的 tf.keras API(而不是旧的低级 AP,这样可以大大减少需要编写的代码量。只需要使用一行代码就可以构建 Keras 神经网络中的一层,如果利用循环结构,则可以进一步减少代码量。
TensorFlow.js 是一个利用 JavaScript 开发和训练机器学习模型,并在浏览器或 Node.js 中部署模型的库。在 TensorFlow.js、ml5.js 之上还有一个高级库,它隐藏了张量和优化器的复杂性。
TensorFlow.js 可以通过浏览器支持移动设备和桌面设备。如果你的浏览器支持 WebGL 着色器 API,TensorFlow.js 可以利用它们发挥 GPU 的优势。与CPU 后端相比,这可以为你提供高达 100 倍的加速。在拥有 GPU 的计算机上,TensorFlow.js 可以非常快速地在浏览器中运行。
TensorFlow Lite 是一个用于移动设备的开源深度学习框架。目前它可以为iOS、ARM64 和 Raspberry Pi 构建模型。TensorFlow Lite 有两个主要组件:解释器和转换器。解释器可以在许多不同的硬件类型上运行经过特别优化的模型。转换器可以将 TensorFlow 模型转换为高效的形式供解释器使用,还可引入优化以缩小可执行文件大小并提高性能。
TensorFlow Extended(TFX)是用于部署生产机器学习管道的端到端平台。在你训练好一个模型后,就需要考虑这方面的工作了。管道包括数据验证、功能工程、建模、模型评估、服务推断以及管理在线、原生移动和 JavaScript 目标的部署。
【Keras】
Keras 是用于构建神经网络模型的高级前端规范和实现。Keras 支持三种后端深度学习框架:TensorFlow、CNTK 和 Theano。目前亚马逊正在全力为Keras 开发 MXNet 后端。你也可以使用 PlaidML(一个独立的项目)作为Keras 的后端,利用 PlaidML 的 OpenCL 支持所有 GPU 的优势。
TensorFlow是Keras的默认后端,在很多情况下我们也推荐使用TensorFlow,包括通过 CUDA 和 cuDNN 在 Nvidia 硬件上实现 GPU 加速,以及利用 Google Cloud 中的 Tensor 处理单元加速等。Keras 除了可以单独安装之外,TensorFlow 还包含一个内部 tf.keras 类。如上所述,这是TensorFlow 的首选高级前端。
Keras 提供了一个高级环境,在其 Sequential 模型中向神经网络添加一层的代码量可以缩减到一行,编译和训练模型也分别只需一个函数调用。如果有需要,Keras 也允许你通过其 Model 或函数式 API 接触较低层上的代码。
你还可以利用 Keras 的子类 keras.Model 进一步深入,一直到 Python 代码级别,直到找到你喜欢的功能 API 。另外,它还有 Scikit-learn API,因此你可以利用 Scikit-learn 网格搜索在 Keras 模型中执行超参数优化。
【深度学习与迁移学习】
PyTorch 和 TensorFlow 都支持深度学习和迁移学习。迁移学习(有时称为自定义机器学习)可以从预先训练好的神经网络模型开始,只需为你的数据定制最终层即可。
从头开始训练深度神经网络非常耗时,并且需要大量标记数据。迁移学习花费的时间更少,而且需要的新标记样本更少,但只有在模型已预先训练好的情况下,你才可以使用迁移学习。幸运的是,所有主流的深度学习框架都提供了某种形式的模型库供你挑选模型。
图像分类中使用的卷积神经网络(也称为 ConvNets 或 CNN )是迁移学习的代表。PyTorch 和 TensorFlow 都提供了有关如何使用迁移学习来训练卷积神经网络的教程。TensorFlow 的迁移学习教程演示了如何使用迁移学习提取和微调特征。PyTorch 的迁移学习教程也演示了相同的两种方法。
如果你想了解有关卷积神经网络迁移学习的更多信息,则可能需要阅读有关该主题的文章:
斯坦福 CS231笔记
https://cs231n.github.io/transfer-learning/
并阅读相关的参考资料。
以下是这些笔记中提到的一个关键点:
实际上,很少有人从头开始训练整个卷积网络(利用随机的初始化),因为你很难拥有足够大的数据集。相反,一般人们会在非常大的数据集(例如ImageNet,其中包含 1,000 个类别的 120 万个图像)上预先训练ConvNet,然后以 ConvNet 为起点或通过 ConvNet 提取感兴趣的特征。
【如何选择深度学习框架】
在 PC 和 Mac 出现的早期,人们经常会问我应该买哪个。其实,这个问题没有正确的答案,因为这个问题本身就是一个错误,或者我应该说“那要看你想用这台电脑干什么”,但一般在我问他们几个问题后,他们就能找到自己的答案,比如“你想用这台电脑干什么?”,或者“你有什么不可或缺的应用吗?”
同样,“我应该使用哪种深度学习框架?”也算不上一个真正的问题。这个问题同样取决于你自己,比如首先想一想“你想用你的模型干什么?”,然后再深入研究你可以用于训练的数据类型。
如果你不熟悉深度学习,那么我建议你先阅读 TensorFlow 2 中的 Keras 教程,以及 PyTorch 中的 fastai 教程。即使不深入了解 TensorFlow 和PyTorch 的低级 API ,你也有很多东西需要学习,而且你应该对这两种方法都有所了解。然后,你可能会意识到这两个框架的确有多相似之处,而且它们赖以生存的概念和技术都是相同的。
在很多情况下,选用哪种框架无关紧要:你会发现每个框架可用的模型基本相同。在某些特定的情况下,可能某个框架优于另一个——至少在当前版本是如此。你可能还会发现,学习其中某一个更为容易,原因可能是框架中的某些基本功能,也有可能是教程的质量。
本文仅做学术分享,如有侵权,请联系删文。
—THE END—