摘要:本文将探讨PyTorch和TensorFlow这两种流行深度学习框架之间的关键相似点和不同点。为什么选择这两个框架,而不是其他的呢?
本文将探讨PyTorch和TensorFlow这两种流行深度学习框架之间的关键相似点和不同点。为什么选择这两个框架,而不是其他的呢?目前有很多的深度学习框架,而且很多都可用于实际的生产,我之所以选择这两个只是因为我对它们特别感兴趣。
TensorFlow由谷歌大脑开发,并且在谷歌公司中广泛地应用于研究和生产需求。它的前身是闭源的DistBelief。
PyTorch是Torch框架的表亲,Torch是基于lua开发的,在Facebook公司里被广泛使用。然而,PyTorch的出现并不是为了支持流行语言而对Torch进行简单的包装,它被重写和定制出来是为了得到更快的速度和本地化。
比较这两个框架最好的方法就是用它们编写代码。
首先,我们用这两个框架为下面这个函数编写一个简单的近似器:
我们将尝试用给定的_x_和函数值_f(x)_来计算未知参数_phi_的值。是的,使用随机梯度下降算法对于这个例子来说简直就是杀鸡用牛刀,很容易就能找到解法,但是这个简单的例子正好能实现我们这篇文章的目的。
我们首先用PyTorch来解决这个问题:
如果你对深度学习框架比较熟悉,那么你可能已经注意到我们正在纯手工打造梯度下降算法。这很不方便,但很幸运,PyTorch有optimize模块,其中包含了诸如RMSProp或Adam等流行优化算法的实现。我们将使用包含momentum的SGD。
PyTorch的损耗函数和指数图
正如你所看到的,我们很快就从训练数据推断出了真正的指数值。现在我们继续使用TensorFlow来试试:
TensorFlow的损耗函数和指数图
正如你所看到的,TensorFlow也能达到相同的目标。但它需要更多的迭代次数来得到指数值,但我相信,这是因为我没有弄清楚优化器的参数才使得两者的结果不具有可比性。
现在我们准备探讨一些不同点。
目前,TensorFlow被许多研究人员和行业专业人士视为一款易于使用的工具。该框架的 文档很齐全,如果官方文档无法满足你的需求,还可以在互联网上找到很多很好的教程。你可以在github上找到数百个已经实现并训练过的模型。
PyTorch相对于其竞争对手而言还比较新(仍处于测试阶段),但它发展迅速。文档和 官方教程也很好。 PyTorch还包含了几个易用并且很流行的计算机视觉架构的 实现。
两个框架都是在张量上进行运算,并将任意一个模型看成是有向非循环图(DAG),但是它们在其定义方面有很大的区别。
TensorFlow遵循“数据即代码,代码即数据”的理念。在TensorFlow中,你可以在模型能够运行之前静态地定义图。与外部世界的所有通信都通过tf.Session对象和tf.Placeholder来执行,这两个张量在运行时会被外部数据替代。
在PyTorch中,图的定义则更为重要和动态化:你可以随时定义、随时更改、随时执行节点,并且没有特殊的会话接口或占位符。总体而言,该框架与Python语言集成地更为紧密,并且在大多数时候用起来感觉更加本地化。而在用TensorFlow开发的时候,你会觉得模型是在一堵墙的后面,仅能通过墙上的几个小洞与之通讯。不管怎么说,这个似乎跟个人偏好有关。
然而,这些方法不仅在软件工程方面有所不同:有几种动态神经网络架构得益于动态方法。召回RNNs:使用静态图,输入序列长度将保持不变。这意味着如果正在开发一个针对英语语句的情绪分析模型,那么必须将句子的长度修正为某个最大值,如果序列的长度不够长,则用零来填充。这个方法似乎不太方便。而且可能会在递归RNN和树RNN方面遇到更多的问题。目前,Tensorflow通过 Tensorflow Fold有限地支持动态输入,而PyTorch则默认支持。
由于PyTorch中的计算图是在运行的时候定义的,因此你可以使用任何一个你喜欢的调试工具,比如pdb、ipdb、PyCharm调试器或者原始的print语句。
而TensorFlow并不能这样。你可以选择使用一款名为 tfdbg的特殊工具,该工具允许在运行时评估TensorFlow表达式,并浏览会话内的所有张量和操作。当然,你无法使用它来调试任何python代码,因此有必要另外使用pdb。
差异3 - 可视化
在可视化方面,Tensorboard非常棒。该工具包含在TensorFlow里,它对于调试和比较不同的训练过程非常有用。例如,在训练模型的时候,你可以在调整某些超参数之后再训练一遍。两次运行过程可以同时显示在Tensorboard上,以显示它们之间存在的差异。Tensorboard能够:
1. 显示模型图
2. 绘制标量变量
3. 使分布和直方图可视化
4. 使图像可视化
5. 使嵌入可视化
6. 播放音频
Tensorboard能够显示通过tf.summary模块收集的各种摘要。我们将为前面提到的那个指数例子定义摘要操作,并使用tf.summary.FileWriter将其保存到磁盘上。
执行tensorboard --logdir=./tensorboard以启动Tensorboard。这个工具对于云实例来说非常方便,因为它是一个webapp。
目前,PyTorch并没有一个类似于Tensorboard的工具,但有一个可以 将Tensorboard集成进来的工具。或者,也可以免费使用标准绘图工具: matplotlib和 seaborn。
对于部署来说,TensorFlow赢得太轻松了:它有一个名叫 TensorFlow Serving的框架,用于在一个指定的gRPC服务器上部署模型。
让我们把目光转向PyTorch。我们可以使用 Flask或者另一种替代方法来基于模型编写一个REST API。如果gRPC不合适的话,这也可以用TensorFlow模型来完成。但是,如果要考虑到性能,那么TensorFlow Serving可能就是一个更好的选择了。
Tensorflow还支持 分布式训练,但PyTorch目前不支持。
我们来为手写数字构建一个CNN分类器。现在,PyTorch看起来真的像一个*框架*了。回想一下,编程框架的作用是为我们提供某个领域的有用抽象,并提供一个方便的方式让我们能够使用这些抽象来解决一些具体的问题。这就是框架与库的本质区别。
在这里,我们将介绍datasets模块,它包含了用于评测深度学习架构的流行数据集的包装。另外nn.Module可用于构建一个自定义的卷积神经网络分类器。nn.Module是PyTorch提供的一个构建块,可用于创建复杂的深度学习架构。torch.nn包中有大量可用作模型基础的模块。
纯TensorFlow看起来更像是一个库,而不是框架:所有的操作都在低层次进行,因此你不得不编写大量的样板代码(我们需要一次又一次地定义这些偏差和权重等等)。
随着时间的推移,TensorFlow高层次包装的整个生态环境开始出现。并且其中的每一个都旨在简化库的使用。其中有很多都在tensorflow.contrib模块中(这个模块的API并不稳定),而有些则开始迁移到主代码仓库中(参见tf.layers)。
所以,在使用TensorFlow以及选择适合任务的框架上有着很大的自由度,你可以在这些框架中选择: TFLearn、 tf.contrib.learn、 Sonnet、 Keras、或者纯tf.layers等等。老实说,对于Keras,值得写一篇文章推荐一下,但现在已经超出了本文的范围。
在这里,我们将使用tf.layers和tf.contrib.learn来构建CNN分类器。其代码遵循 tf.layers官方教程:
所以,TensorFlow和PyTorch都提供了有用的抽象来减少样板代码的数量并加快模型的开发。它们之间主要的区别在于,PyTorch可能感觉更“Python化”,并且有面向对象的方法,而TensorFlow则有多个框架可供选择。
就个人而言,我认为PyTorch更为清晰,对开发者更为友好。它的torch.nn.Module让你能够以面向对象的方式来定义可重用的模块,这种方法非常灵活非常强大。然后,你可以使用torch.nn.Sequential来组成各种模块。此外,你还可以以 函数的形式使用所有的内置模块,这非常方便。总的来说,API的各个方面用起来都很顺手。
当然,你可以用纯TensorFlow编写出非常简洁的代码,但你需要更强的编码能力和不断试错才能达到这个目标。而如果使用诸如Keras或者TFLearn这样的高层次框架的话,就可能会降低TensorFlow本身所具有的灵活性。
TensorFlow是一个非常强大非常成熟的深度学习库,具有非常强大的可视化功能,以及有多个可供选择的框架来进行高级模型开发。它具有用于生产的部署选项,以及对移动平台的支持。 如果你有以下需求,那么TensorFlow是一个很好的选择:
1. 开发生产模型
2. 开发需要部署在移动平台上的模型
3. 需要良好的社区支持和齐全的文档
4. 想要各种形式的丰富的学习资源(TensorFlow有一个 大型开放式网络课程)
5. 想要或需要使用Tensorboard
6. 需要大规模的分布式模型训练
PyTorch仍然是一个年轻的框架,但其发展速度越来越快。如果你有以下需求,它可能会比较适合你:
1. 用于研究,或者是用于生产的非功能性需求并不是很苛刻
2. 需要更好的开发和调试体验
3. 爱所有Python化的东西
如果你有时间,最好两个都试试,看看哪个最能满足你的需求。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删