Python深度学习框架回顾
摘要
本文翻译自Madison May发布的 Python Deep Learning Frameworks Reviewed,经原作者授权由InfoQ中文站翻译并分享。本文对于常用的基于Python的深度学习框架Theano、Lasagne、Blocks、TensorFlow、Keras、MXNet、PyTorch进行了介绍与优劣比较,有助于深度学习入门者对于这些框架形成初步的认识。
正文
最近我一直在思考某个Data Science Stack Exchange上存在很久的问题:什么才是最好的基于Python的神经网络库? 时光飞逝,在过去的两年半的时间里涌现出了很多基于Python的 深度学习框架,而我2014年七月份推荐的pylearn2这个框架早已物是人非,不再维护。可喜的是已经有不少优秀的深度学习框架填补了它的空缺,成为了indico日常产品开发中重要的组成部分。当然,尺有所短,寸有所长,每个框架都有其优势与不足;我也希望在本文中基于自己的工作经历对于2017年中的Python深度学习生态进行一个综合宏观的介绍,希望为初学者勾勒出一幅清晰的群雄逐鹿图。具体而言,本文会着眼于以下框架:
- Theano
- Lasagne
- Blocks
- TensorFlow
- Keras
- MXNet
- PyTorch
描述:
Theano是一个允许你定义、优化以及高效执行包含多维数组的数学表达式的Python库;它支持GPU操作,并且能够进行高速的符号微分运算。
文档:
http://deeplearning.net/software/theano/
总结:
Theano不仅仅是一个可以独立使用的库,它还是我们下面介绍的很多框架的底层数值计算引擎;它来自蒙特利尔大学MILA实验室,由Frédéric Bastien最早创建。Theano提供的API相对底层,因此如果你希望高效运行Theano,你必须对它的底层算法非常熟悉。如果你拥有丰富的机器学习理论知识与经验,并且你希望对于自己的模型有细粒度的控制或者自己动手创建新的模型,那么Theano是个不错的选择。总结而言,Theano最大的优势就是其灵活性。
优势:
不足:
- 陡峭的学习曲线
- 大量的底层API
- 编译复杂符号图的时候可能会很慢
资源:
描述:
基于Theano的轻量级神经网络构建与训练库。
文档:
http://lasagne.readthedocs.org/
总结:
鉴于Theano着重打造面向符号数学的工具库,Lasagne提供了基于Theano的相对高层的抽象,使它对于偏向工程的深度学习开发者更为友好。它最早由DeepMind的研究学者Sander Dieleman开发与维护。不同于Theano中网络模型需要指定为符号变量的表达式,Lasagne允许用户以层的概念来定义网络,并且引入了所谓的 “Conv2DLayer” 与 “DropoutLayer”。Lasagne以牺牲部分灵活性为代价提供了常用的组件来进行层构建、初始化、模型正则化、模型监控与模型训练。
优势:
- 还是比较灵活的
- 比Theano提供了更高层的抽象接口
- 文档与代码更为条理清晰
不足:
资源:
描述:
基于Theano的神经网络构建与训练框架。
文档:
http://blocks.readthedocs.io/en/latest/
总结:
类似于Lasagne,Blocks在Theano的基础上添加了对于层的抽象,从而方便定义更加清晰,简单且标准的深度学习模型。它同样来源于蒙特利尔大学的MILA实验室,同样也是Theano与PyLearn2的作者。Blocks相对于Lasagne具有更复杂的学习曲线,不过它也提供了更加灵活的接口操作。除此之外,Blocks对于循环神经网络架构有非常好的支持,因此我个人很推荐你尝试下它;Blocks也是除了TensorFlow之外我们在indico工作中首先考虑的选择了。
优势:
- 还是比较灵活的
- 比Theano提供了更高层的抽象接口
- 提供了相对完备的测试
不足:
资源:
描述:
使用数据流图进行数值计算的开源软件库。
文档:
https://www.tensorflow.org/api_docs/python/
总结:
TensorFlow集成了类似于Theano这样底层的符号计算功能,也包含了类似于Blocks或者Lasagne这样的高层API。尽管TensorFlow登上Python深度学习库的时间尚短,但是它已经成为了最受瞩目、社区最为庞大的工具。TensorFlow由Google大脑团队发布并且维护,它支持多GPU的机器学习模型,提供了高效的数据管道以及内建的用于审视、可视化以及序列化模型的功能。最近TensorFlow团队决定添加对于Keras的内建支持,使得TensorFlow具备更好的可用性。尽管社区都认同 TensorFlow是有缺陷的,但是因为其社区的庞大与项目背后支持力量,学习TensorFlow会是个不错的选择;TensorFlow也是现在indico的首选机器学习库。
优势:
- 由Google支持
- 社区很繁荣
- 同时提供了底层与高层的网络训练接口
- 比Theano能够更快地训练模型
- 清晰的多GPU支持
不足:
- 一开始的时候性能不是很好
- 对RNN的支持度仍然落后于Theano
资源:
描述:
支持卷积神经网络,循环神经网络的Python深度学习库,能够运行在Theano或者TensorFlow之上。
文档:
https://keras.io/
总结:
Keras算是这个列表中提供了最高层接口、用户使用最友好的深度学习库了。它由Google大脑团队的Francis Chollet创建与维护;它允许用户自由选择底层模型构建框架,可以是Theano或者TensorFlow。Keras的用户交互借鉴了Torch,如果你有基于Lua进行机器学习的经验,Keras会是很值得一试的工具。因为Keras完善的文档与简单易用的接口,Keras的社区非常繁荣与活跃。最近,TensorFlow团队宣布计划将内建支持Keras,因此不久的将来Keras会是TensorFlow项目的子集了吧。
优势:
- 你可以自由选择使用Theano或者TensorFlow
- 直观,高级的接口
- 相对简单的学习曲线
不足:
资源:
描述:
MXNet致力于提供兼顾性能与灵活性的深度学习框架。
文档:
http://mxnet.io/api/python/index.html#python-api-reference
总结:
作为Amazon的钦定深度学习框架,MXNet也算是性能最好的深度学习框架之一了。它提供了类似于Theano与TensorFlow的数据流图,并且支持多GPU配置,提供了类似于Lasagne与Blocks的相对高阶的模型构建块,还能运行在多种硬件设备上(包括移动设备)。Python只是MXNet支持的多种语言之一,它还提供了基于R, Julia, C++, Scala, Matlab以及JavaScript的多种接口。如果你专注于效率,那么MXNet是个不二选择,不过你可能会要让自己习惯MXNet中很多的奇怪设定。
优势:
不足:
资源:
描述:
支持强力GPU加速的Python Tensor与 动态神经网络库。
文档:
http://pytorch.org/docs/
总结:
PyTorch问世不过数周,在我们的深度学习框架列表中尚属新生儿。虽然PyTorch主要基于Lua Torch,但是它是由Facebook人工智能研究团队(FAIR)支持的,并且它设计初衷就是用来处理动态计算图问题,这个特性也是其他的Theano,TensorFlow,以及其他扩展框架所没有的。虽然PyTorch尚未成熟,但是因为它这一特性我们相信它会在未来的Python深度学习生态系统中占据一席之地,并且我们认为它是个非常不错的选项。
优势:
- 由Facebook支持与维护
- 支持动态图计算
- 同时提供了高层接口与底层接口
不足:
- 与竞争者相比还不成熟
- 除了官方文档之外的相关资料尚处于短缺
资源:
参考英文原文:Python Deep Learning Frameworks Reviewed