TensorFlow与PyTorch在A卡上的性能对比

一、pytorch、Keras、TensorFlow三者之间的区别

TensorFlow是最著名的用于深度学习生产环境的框架。它有一个非常大非常棒的社区。然而,TensorFlow的使用不那么简单。另一方面,Keras是在TensorFlow基础上构建的高层API,比TF(TensorFlow的缩写)要易用很多。

Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端。无论是Theano还是TensorFlow,都是一个“符号式”的库。

1、非竞争性特点

下文介绍了TensorFlow、PyTorch和Keras的几个不同之处,便于读者对这三个框架有初步了解。列出这些区别的重点不在于对三者做比较,而在于做一个初步介绍。


TensorFlow

· 开发者:Google

· 2017年1月发布1.0版本


PyTorch

· 开发者:Facebook

· 2018年10月发布1.0版本

· 基于Torch开发(Torch是基于Lua开发的另一个深度学习框架)


Keras

· 是一个高级API,降低了深度学习框架的复杂程度

· 可以在其他深度学习API,如TensorFlow、Theano和CNTK上运行

· 本身并不是一个库


2、竞争性区别

下面将介绍这三个框架更加具有竞争性的区别。本文着重分析比较了这三个框架用于自然语言处理(Natural Language Processing,NLP)时的不同之处。


可用的RNN类型

当试图用深度学习方法来解决NLP问题时,循环神经网络(Recurrent Neural Networks,RNNs)是开发者最常用的专业架构。因此,本文也选择从这一角度切入来比较TensorFlow、PyTorch和Keras框架。

本文比较的三种框架都具有可用于构建简单RNN以及更复杂的RNN——门控循环单元(Gated Recurrent Units,GRU)和长短时记忆网络(Long Short Term Memory networks,LSTM)的模块。


PyTorch:

PyTorch提供2种不同层次的类别(class)用于构建循环网络:

· 多层次类别(Multi-layer classes),包括nn.RNN、nn.GRU和nn.LSTM。这些类别的基类(Object)可用于表示深度双向循环神经网络。

· 单元层类别(Cell-level classes),包括nn.RNNCell、nn.GRUCell和nn.LSTMCell。这些类别的基类仅可用于表示单个单元(如简单RNN、LSTM及GRU的单元),即处理输入数据一个时间步长的单元。

因此,当神经网络中不需要太多定制时,多层次类别对单元层类别来说,就像是不错的包装类(wrapper)。

此外,构建一个双向RNN非常简单,只需在多层次类别中将双向实参设置为True就可以了。


TensorFlow:

TensorFlow提供tf.nn.rnn_cell模块用于构建标准RNN。

tf.nn.rnn_cell模块中最重要的类别包括:

· 单元层类别(Cell level classes):用于定义RNN的单个单元,即BasicRNNCell、GRUCell和LSTMCell。

· 多RNN单元类别(MultiRNNCell class):用于堆栈多个单元,以创建深度RNN。

· 随机失活包装类别(DropoutWrapper class):用于执行dropout正则化。


Keras:

Keras库提供的循环层包括:

· 简单RNN——全连接RNN,其输出被反馈到输入中

· GRU——门控循环单元层

· LSTM——长短时记忆层

TensorFlow、PyTorch和Keras都具有构建常见RNN架构的内置功能。它们的区别在于接口不同。

Keras的接口非常简单,包含一小串定义明确的参数,能够使上述类别的执行更加简单。作为一个能够在TensorFlow上运行的高级API,Keras使得TensorFlow更加简单。TensorFlow和PyTorch两者的灵活性差不多,但是后者的接口更加简洁明了。


TensorFlow、PyTorch、Keras易用性对比

TensorFlow常因其范围狭小的API而被诟病。相比之下,PyTorch对用户则更为友好,使用也更加简单。总之,PyTorch与Python语言的融合更为紧密,也更加自然。而在TensorFlow框架中编写程序时,程序员常感到自己与模型之间仿佛隔着一堵砖墙,只留下了几个洞孔用于交流。



下文将讨论并比较更多影响这三个框架易用性的因素:

· 静态计算图vs动态计算图:

计算图是NLP中非常重要的一个因素。TensorFlow使用静态计算图,PyTorch则使用动态计算图。

这也就意味着在TensorFlow中,需要先静态定义计算图,再运行模型。所有与外界的沟通都通过tf.Session对象和tf.Placeholder进行,而这两个张量在运行时库中都会被外部数据替代。

PyTorch中的计算图则更为重要和灵活。用户可以根据需要定义、改变和执行节点,无需依赖特殊的会话接口或占位符。

RNN静态图的输入序列长度通常是固定的。也就是说,开发一个英文句子情感分析模型必须将句子长度固定到某个最大值,并用0填充所有过短的序列。这真的很不方便。


· 调试:

由于PyTorch在运行时库中定义计算图,所以用户可以使用自己喜爱的调试工具,如pdb、ipdb、PyCharm debugger、old trusty print statements等。

但上述情况并不适用于TensorFlow。在TensorFlow中,用户可以选择使用一个名为tfdbg的特殊工具,用于评估运行时库的TensorFlow表达式和浏览会话作用域中的所有张量和操作。但是,这一工具显然不能调试python代码。所以用户还必须再使用pdb进行调试。


· 社区规模:

和PyTorch相比,TensorFlow更加成熟,其社区规模比PyTorch和Keras的社区规模加起来还要大得多,用户基数的增长也比PyTorch和Keras要快。

这也就意味着:

· 有更大规模的社区,如StackOverFlow上的社区,帮助你解决问题

· 有更多的线上学习资料,如博客、视频、课程等

· 能更快掌握最新的深度学习技术



NLP的未来

循环神经网络作为用作NLP任务的专业架构已经有相当长的一段时间了,但这一情况并不会长期不变。一个最新开发的基于注意力机制的变换模型(transformer model)已经在研究者之间流行开来。

这一模型已经代替RNN成为了新的NLP标准。一些评论家认为,Transformer将会成为2019年主流NLP深度学习架构。

在这场比赛中,TensorFlow似乎领先于另外两个框架:

· 首先,注意力架构是Google自己研发的。

· 其次,只有TensorFlow有Transformer稳定版架构。

但这并不是说PyTorch已经远远地落在了后面。Huggingface的GitHub已经发布了很多预训练的PyTorch transformer模型:https://github.com/huggingface/pytorch-transformers。

另外,Google最近发布的TensorFlow 2.0很可能将带来翻天覆地的变化!



具体来说:

· Keras将会成为TensorFlow的高级API,其功能将会被扩展,使得用户能够在tf.keras上直接使用TensorFlow的最新功能。任一范围的TensorFlow及其硬件设备都将具备Keras的简便性。


· TensorFlow 2.0默认为动态图机制(eager execution)。用户甚至在eager context中也可以使用计算图,这将使调试和原型设计更为简单。TensorFlow运行时库则会在后台调控性能和规模。


· TensorBoard会和Keras整合——这在目前无法实现。

所以,本文猜想,TensorFlow 2.0将会消除几乎所有TensorFlow的不足。TensorFlow作为所有深度学习任务专业框架的地位将会得到巩固,甚至变得更好!


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空