前几天,量子位发过一篇《忽悠VC指南》。其中有一条建议是,当你假装AI专家时,最好别谈众人皆知的TensorFlow,那谈什么? 其实这也不全然都是调侃。和TensorFlow相比,PyTorch确实也有为数不少的拥趸。根据Keras作者François Chollet发布的数据显示:GitHub上的各种深度学习框架中,PyTorch排在第五位。 但需要提醒大家的是,PyTorch可是今年1月19日才正式发布。 △二季度深度学习框架排名 最近,斯坦福大学研究机器学习的博士生Awni Hannun,围绕PyTorch还是TensorFlow这个话题,做了一个深入的比较。量子位把内容传送如下: 我写的这份指南,主要对比了PyTorch和TensorFlow之间的区别。希望对那些想着手开始一个新项目或者考虑转换深度学习框架的人有所帮助。 我主要考察了深度学习堆栈的训练和部署时,相关的可编程性和灵活性。在这里,我不会过多的谈论速度、内存占用等方面的权衡。 先放结论 PyTorch更有利于研究人员、爱好者、小规模项目等快速搞出原型。而TensorFlow更适合大规模部署,特别是需要跨平台和嵌入式部署时。 然后咱们一项一项分着说。 上手时间 赢家:PyTorch PyTorch本质上是Numpy的替代者,而且支持GPU、带有高级功能,可以用来搭建和训练深度神经网络。如果你熟悉Numpy、Python以及常见的深度学习概念(卷积层、循环层、SGD等),会非常容易上手PyTorch。 而TensorFlow可以看成是一个嵌入Python的编程语言。你写的TensorFlow代码会被Python编译成一张图,然后由TensorFlow执行引擎运行。我见过好多新手,因为这个增加的间接层而困扰。也正是因为同样的原因,TensorFlow有一些额外的概念需要学习,例如会话、图、变量作用域(variable scoping)、占位符等。 另外还需要更多的样板代码才能让一个基本的模型运行。所以TensorFlow的上手时间,肯定要比PyTorch长。 图创建和调试 赢家:PyTorch 创建和运行计算图可能是两个框架最不同的地方。在PyTorch中,图结构是动态的,这意味着图在运行时构建。而在TensorFlow中,图结构是静态的,这意味着图先被“编译”然后再运行。 举一个简单的例子,在PyTorch中你可以用标准的Python语法编写一个for循环结构 for _ in range(T): h = torch.matmul(W, h) + b 此处T可以在每次执行代码时改变。而TensorFlow中,这需要使用“控制流操作”来构建图,例如tf.while_loop。TensorFlow确实提供了dynamic_rnn用于常见结构,但是创建自定义动态计算真的更加困难。 PyTorch中简单的图结构更容易理解,更重要的是,还更容易调试。调试PyTorch代码就像调试Python代码一样。你可以使用pdb并在任何地方设置断点。调试TensorFlow代码可不容易。要么得从会话请求要检查的变量,要么学会使用TensorFlow的调试器(tfdbg)。 全面性 赢家:TensorFlow 随着PyTorch逐渐成熟,我预计这部分的差距会趋近于零。但目前,TensorFlow还是有一些PyTorch不支持的功能。它们是: 沿维翻转张量(np.flip, np.flipud, np.fliplr) 检查无穷与非数值张量(np.is_nan, np.is_inf) 快速傅里叶变换(np.fft) 这些TensorFlow都支持。另外,TensorFlow的contrib软件包中,有更多PyTorch没有的高级功能和模型。 序列化 赢家:TensorFlow 两种框架下保存和加载模型都很简单。PyTorch有一个特别简单的API,可以保存模型的所有权重或pickle整个类。TensorFlow的Saver对象也很易用,而且为检查提供了更多的选项。 TensorFlow序列化的主要优点是可以将整个图保存为protocol buffer。包括参数和操作。然而图还能被加载进其他支持的语言(C++、Java)。这对于部署堆栈至关重要。理论上,当你想改动模型源代码但仍希望运行旧模型时非常有用。 部署 赢家:TensorFlow 对于小规模的服务器端部署(例如一个Flask web server),两个框架都很简单。 对于移动端和嵌入式部署,TensorFlow更好。不只是比PyTorch好,比大多数深度学习框架都要要。使用TensorFlow,部署在Android或iOS平台时只需要很小的工作量,至少不必用Java或者C++重写模型的推断部分。 (责任编辑:本港台直播) |