为什么要用 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,你也有很多东西需要学习,而且你应该对这两种方法都有所了解。然后,你可能会意识到这两个框架的确有多相似之处,而且它们赖以生存的概念和技术都是相同的。

在很多情况下,选用哪种框架无关紧要:你会发现每个框架可用的模型基本相同。在某些特定的情况下,可能某个框架优于另一个——至少在当前版本是如此。你可能还会发现,学习其中某一个更为容易,原因可能是框架中的某些基本功能,也有可能是教程的质量。

【END】

原文发布于微信公众号 - 相约机器人(xiangyuejiqiren)

原文发表时间:2019-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券