Theano在单GPU上执行效率不错,性能和其他框架类似。但是运算时需要将用户的Python代码转换成CUDA代码,再编译为二进制可执行文件,编译复杂模型的时间非常久。此外,Theano在导入时也比较慢,而且一旦设定了选择某块GPU,就无法切换到其他设备。目前,Theano在CUDA和cuDNN上不支持多GPU,只在OpenCL和Theano自己的gpuarray库上支持多GPU训练,速度暂时还比不上CUDA的版本,并且Theano目前还没有分布式的实现。不过,Theano在训练简单网络(比如很浅的MLP)时性能可能比TensorFlow好,因为全部代码都是运行时编译,不需要像TensorFlow那样每次feed mini-batch数据时都得通过低效的Python循环来实现。
Theano是一个完全基于Python(C++/CUDA代码也是打包为Python字符串)的符号计算库。用户定义的各种运算,Theano可以自动求导,省去了完全手工写神经网络反向传播算法的麻烦,也不需要像Caffe一样为Layer写C++或CUDA代码。Theano对卷积神经网络的支持很好,同时它的符号计算API支持循环控制(内部名scan),让RNN的实现非常简单并且高性能,其全面的功能也让Theano可以支持大部分state-of-the-art的网络。Theano派生出了大量基于它的深度学习库,包括一系列的上层封装,其中有大名鼎鼎的Keras,Keras对神经网络抽象得非常合适,以至于可以随意切换执行计算的后端(目前同时支持Theano和TensorFlow)。Keras比较适合在探索阶段快速地尝试各种网络结构,组件都是可插拔的模块,只需要将一个个组件(比如卷积层、激活函数等)连接起来,但是设计新模块或者新的Layer就不太方便了。除Keras外,还有学术界非常喜爱的Lasagne,同样也是Theano的上层封装,它对神经内网络的每一层的定义都非常严谨。另外,还有scikit-neuralnetwork、nolearn这两个基于Lasagne的上层封装,它们将神经网络抽象为兼容Scikit-learn接口的classifier和regressor,这样就可以方便地使用Scikit-learn中经典的fit、transform、score等操作。除此之外,Theano的上层封装库还有blocks、deepy、pylearn2和Scikit-theano,可谓是一个庞大的家族。如果没有Theano,可能根本不会出现这么多好用的Python深度学习库。同样,如果没有Python科学计算的基石NumPy,就不会有SciPy、Scikit-learn和 Scikit-image,可以说Theano就是深度学习界的NumPy,是其他各类Python深度学习库的基石。虽然Theano非常重要,但是直接使用Theano设计大型的神经网络还是太烦琐了,用 Theano实现Google Inception就像用NumPy实现一个支持向量机(SVM)。且不说很多用户做不到用Theano实现一个Inception网络,即使能做到但是否有必要花这个时间呢?毕竟不是所有人都是基础科学工作者,大部分使用场景还是在工业应用中。所以简单易用是一个很重要的特性,这也就是其他上层封装库的价值所在:不需要总是从最基础的tensor粒度开始设计网络,而是从更上层的Layer粒度设计网络。
Torch官方网址:
GitHub:github.com/torch/torch7
Torch给自己的定位是LuaJIT上的一个高效的科学计算库,支持大量的机器学习算法,同时以GPU上的计算优先。Torch的历史非常悠久,但真正得到发扬光大是在Facebook开源了其深度学习的组件之后,此后包括Google、Twitter、NYU、IDIAP、Purdue等组织都大量使用Torch。Torch的目标是让设计科学计算算法变得便捷,它包含了大量的机器学习、计算机视觉、信号处理、并行运算、图像、视频、音频、网络处理的库,同时和Caffe类似,Torch拥有大量的训练好的深度学习模型。它可以支持设计非常复杂的神经网络的拓扑图结构,再并行化到CPU和GPU上,在Torch上设计新的Layer是相对简单的。它和TensorFlow一样使用了底层C++加上层脚本语言调用的方式,只不过Torch使用的是Lua。Lua的性能是非常优秀的(该语言经常被用来开发游戏),常见的代码可以通过透明的JIT优化达到C的性能的80%;在便利性上,Lua的语法也非常简单易读,拥有漂亮和统一的结构,易于掌握,比写C/C++简洁很多;同时,Lua拥有一个非常直接的调用C程序的接口,可以简便地使用大量基于C的库,因为底层核心是C写的,因此也可以方便地移植到各种环境。Lua支持Linux、Mac,还支持各种嵌入式系统(iOS、Android、FPGA等),只不过运行时还是必须有LuaJIT的环境,所以工业生产环境的使用相对较少,没有Caffe和TensorFlow那么多。
为什么不简单地使用Python而是使用LuaJIT呢?官方给出了以下几点理由。
LuaJIT的通用计算性能远胜于Python,而且可以直接在LuaJIT中操作C的pointers。
Torch的框架,包含Lua是自洽的,而完全基于Python的程序对不同平台、系统移植性较差,依赖的外部库较多。