在开发深度学习模型时,一个经常被问到的问题是“我应该使用 TensorFlow 还是 PyTorch?”
从头开始创建神经网络可能需要几天甚至几周的时间。为了简化这个过程,缺乏资源和时间的开发人员使用神经网络框架。可以使用许多这样的框架,但目前真正流行的是 PyTorch 和 TensorFlow。
毫无疑问,这两个都是简化大规模深度神经网络模型实现的优秀框架;尽管如此,总是要决定使用哪一个。这个决定并不容易,因为这两个框架都有其优点。
在本文中,我们将基于以下因素比较这两个框架,TensorFlow 和 PyTorch:
- 人气
- 文档和来源
- 学习曲线
- 图构建
- 调试
- 可视化
- 序列化
- 部署
人气
- 堆栈溢出如今,由于 Stack Overflow 是最受信任的社区,开发人员的大部分问题都得到了解答。Stack Overflow 的统计数据如下:
从上图中,我们可以看到,与 PyTorch 相比,过去几年开发者提出的大部分问题都是关于 TensorFlow 的。原因是 PyTorch 的发布晚了一年。可以观察到,在 2016 年末 PyTorch 发布后,TensorFlow 的图表已经开始有点扁平化,而 PyTorch 的图表却在持续上升。
- 谷歌趋势
从上图我们可以看出,PyTorch 发布后,它的热度一直在持续上升,按照趋势,它可能很快就会超过 TensorFlow。这些图表取决于有多少人在谷歌搜索与这些框架中的任何一个相关的内容。
我们不能说 TensorFlow 在受欢迎程度方面取得了压倒性的胜利,因为 PyTorch 正在迅速崛起,但目前 TensorFlow 仍然比 Pytorch 更受欢迎。
获胜者:TensorFlow
文档和来源
TensorFlow 和 PyTorch 的官方网站都有非常清晰的文档,并且有足够多的教程来解决我们可能遇到的任何问题。由于 PyTorch 比 TensorFlow 更新一些,因此它的非官方资料数量少于 TensorFlow。即便如此,整体可用的教程和预训练模型也绰绰有余。
我们可以说,如果您仅依赖在线支持,TensorFlow 提供的材料可能会更加多样化。
获胜者:Tie
学习曲线
PyTorch 整体非常简单,并且有 NumPy 作为先决条件。因此,它的学习曲线非常平缓,因为在开始开发之前没有太多新概念需要掌握。
另一方面,TensorFlow 需要一些新概念,例如变量作用域、占位符和会话。这些限制需要一些额外的 TensorFlow 项目样板代码,但并不广泛。
import tensorflow as tf
x = tf.placeholder("float", None)
y = x * 2
with tf.Session() as session:
result = session.run(y, feed_dict={x: [1, 2, 3]})
import torch as t
x = t.Tensor([1, 2, 3])
result = x * 2
我们可以说 PyTorch 在这里占据上风,因为它的学习曲线平缓。
获胜者:PyTorch
图构建
PyTorch 和 TensorFlow 都将模型视为有向无环图 (DAG)。这些被称为计算图。当必须创建这些图表时,就会出现差异。
TensorFlow 在编译时静态创建此图,而 PyTorch 动态创建它。这意味着,在运行模型之前,TensorFlow 会构建图形。模型通过会话对象和占位符与外部环境进行通信。占位符是张量,它为模型提供来自模型外部的数据,而会话保存所有计算的中间值,这些计算正在按照图表的指示执行。
PyTorch 要简单得多,因为图形是为每个前馈动态构建的。您不必费心使用占位符或会话,从而使用 Python 给人一种更原生的感觉。
在 TensorFlow 中,当必须在每次迭代中将可变长度的数据馈送到模型时,这会导致困难,就像在使用 RNN 的自然语言处理中一样。但是,在 PyTorch 中,每次迭代时构建图也有一些开销。我们可以说,总体而言,由于 PyTorch 中图形构建的动态特性,它在该领域比 TensorFlow 略有优势。
获胜者:PyTorch
可视化
TensorBoard 是一个可以与 TensorFlow 一起使用的工具。这是一个很棒的工具,它允许我们直接在浏览器窗口中查看我们的模型。如果您有 2 次连续运行具有不同超参数的模型,TensorBoard 可以同时显示两者的差异。要在 Pytorch 中查看模型之间的差异,您必须使用 Matplotlib 或 Seaborn,因为没有可用的原生查看工具。
获胜者:TensorFlow
序列化
使用这两个框架保存和加载模型非常容易。在 PyTorch 中,如果需要,我们可以保存模型的权重或保存整个模型,然后稍后加载以进行预测。另一方面,在 TensorFlow 中,由于其图形的静态特性,可以保存其图形,然后可以根据需要将其加载到不使用 Python 而是使用 C++ 或 JAVA 的环境中。当 Python 不是一个选项时,这特别有用。
获胜者:TensorFlow
部署
TensorFlow 有一个名为 TensorFlow Serving 的部署框架,它将模型部署在专门的 gRPC 服务器上。另一方面,Pytorch 模型必须使用 Flask 或 Django 封装到 API 中,以便可以从服务器获取。
获胜者:TensorFlow
结论
总的来说,没有一个可以开始的最佳框架。两者都有优点和缺点。从上面的总结中可以看出,PyTorch 现在正在以极快的速度崛起,并且更加用户友好。在使用 TensorFlow 时,您可以更好地控制您的模型。TensorFlow 还有一些很棒的工具,比如 TensorFlow Serving 和 TensorBoard,它们在 PyTorch 中是不可用的。
对于使用这些框架中的任何一个的人来说,这是个人选择,但我个人会推荐 PyTorch,原因很简单,因为学习曲线平缓。如果一项任务似乎超出了 PyTorch 的范围,那么您可能会转移到 TensorFlow,但在那之前,PyTorch 就足够了。