1.6 卷积神经网络的平台和工具
为了在解决各种实际问题中有效地利用深度学习模型,特别是卷积神经网络,现在已经有很多开发平台和工具可以选择。比较常用的有Theano、TensorFlow、Caffe、Caffe 2、CNTK、MXNet、Torch、Deeplearning4J和Keras等,其中TensorFlow、Caffe 2和MXNet之间的竞争可能会比较激烈。目前,这些平台和工具还没有任何一种完善到足以解决“所有”的业务问题,大多通过专有解决方案提供先进的机器学习和人工智能的功能,包括手写字符识别、图像识别、视频识别、语音识别、自然语言处理和对象识别等高级功能。下面分别对它们进行简要的说明。
1)Theano由蒙特利尔大学学习算法学院的30~40名教师和学生集体维护,其创始人是深度学习研究的重要贡献者Yoshua Bengio。Theano通过BSD许可发布,支持快速开发高效的机器学习算法。Theano的结构相当简单,以Python为代码库和接口,其中C/CUDA代码也被打包成Python字符串。这对开发者来说很难驾驭、调试和重构。Theano开创了使用符号图来编程网络的趋势,其符号API支持循环控制,使得循环神经网络的实现更容易、更高效。虽然Theano是一个很好的学术研究工具,在单个CPU上的运行效率较高,但缺乏分布式应用程序管理框架,只支持一种编程开发语言,在开发大型分布式应用程序时可能会遇到挑战。
2)TensorFlow来自早期的Google库DistBelief V2,是作为Google Brain项目的一部分开发的专有深度网络库。由于TensorFlow支持广泛的功能,如图像识别、手写字符识别、语音识别、预测以及自然语言处理,所以在2015年11月9日以Apache 2.0许可开源后,谷歌立即获得了大量的关注。有些人评价TensorFlow是对Theano的重新设计。TensorFlow在2017年2月15日发布了1.0版本,是8个先前版本的累积,解决了很多不完整的核心功能和性能问题。TensorFlow的编程接口包括Python和C++,并支持Java、Go、R和Haskell API的alpha版本接口。另外,TensorFlow支持精细的网格层,允许用户构建新的复杂层类型,允许模型的不同部分在不同的设备上并行训练,还可以使用C++ Eigen库在ARM架构上编译和优化。经过训练的TensorFlow模型可以部署在各种服务器或移动设备上,无须实现单独的解码器或加载Python解释器。
3)Caffe开创于2013年年底,可能是第一个主流的行业级深度学习工具包,由领导Facebook AI平台工程的贾扬清负责设计和实现,在BSD 2-Clause开源许可后发布。作为一种在计算机视觉界最受欢迎的工具包,Caffe具有优良的卷积神经网络模型结构,在2014年ImageNet挑战赛中脱颖而出。Caffe的运行速度快,学习速度为4ms/图,推理速度为1ms/图,在单个Nvidia K40 GPU上每天处理超过6000万张图片,是研究实验和商业部署的完美选择。Caffe是基于C++的,可以在各种跨平台设备上编译,包括一个Windows的端口,支持C++、Matlab和Python等编程接口。而且,Caffe拥有一个庞大的用户社区为其深层网络存储库做贡献,包括AlexNet和GoogLeNet两种流行的用户网络。Caffe的缺点是不支持细粒度网络层,在构建复合层类型时必须以低级语言完成,对常规网络和语言建模的支持总体上很差。
4)Caffe 2是Caffe的升级版,于2017年4月18日由Facebook根据BSD许可协议开源,继续强力支持视觉类型问题,并增加了自然语言处理、手写识别和时间序列预测的循环神经网络和长短期记忆网络。Caffe 2可以把Caffe模型轻松转换为实用程序脚本,但更侧重于模块化、卓越的移动和大规模部署,能够像TensorFlow一样使用C++ Eigen库来支持ARM架构,并在移动设备上部署深度学习模型。随着Facebook最新宣布其改变航向,Caffe 2在深度学习社区中为大众所热捧,可能超越Caffe成为主要的深入学习框架。
5)CNTK开始称为Computational Network Toolkit(计算网络工具包),但在CNTK 2.0 Beta1版本根据MIT许可发布后被正式更名为Microsoft Cognitive Toolkit(微软认知套件)。CNTK最早是由微软的计算机科学家开发的,目的是想要更快、更高效地提高语音识别技术,但很快就超越了语音领域并演变成了一个产品,包括一些领先的国际家电制造商和微软的旗舰产品组在内的客户依靠它来执行各种各样的深度学习任务。CNTK可以运行在使用传统CPU或GPU的计算机上,既可以运行在一台笔记本电脑上,也可以运行在数据中心的一系列计算机上,支持使用Python或C++编程接口的64位Linux和Windows操作系统,能够轻松处理从相对较小到非常巨大等各种规模的数据集。与TensorFlow和Theano的组成相似,CNTK的网络被描述为向量运算(如矩阵的加法/乘法或卷积)的符号图,允许用户构建细粒度的网络层并创造新的复合层类型,而不像Caffe那样需要通过低级语言实现。此外,CNTK又有点类似Caffe,也是基于C++的,具有跨平台的CPU/GPU支持,并在Azure GPU Lab提供了最高效的分布式计算性能。目前,CNTK的主要不足是对ARM架构缺乏支持,这限制了其在移动设备上的功能。
6)MXNet(发音为“mix-net”)起源于卡内基-梅隆大学和华盛顿大学,2017年1月30日进入Apache基金会成为孵化器项目,是一个功能齐全、可编程和可扩展的深度学习框架,支持各种深度学习模型(比如卷积神经网络、循环神经网络和长短期记忆网络),也是目前唯一支持生成对抗网络模型的深度学习框架。而且,MXNet提供了混合编程模型(命令式和声明式)的功能、大量编程语言的代码(包括Python、C++、R、Scala、Julia、Matlab和JavaScript),以及强大的扩展能力(如GPU并行性和内存镜像、编程器开发速度和可移植性),甚至被有些人称为世界上最好的图像分类器。此外,MXNet与Apache Hadoop YARN(一种通用的、分布式的应用程序管理框架)集成,使其成为TensorFlow的竞争对手。特别是,亚马逊首席技术官Werner Vogels选择公开支持MXNet,苹果公司在2016年收购Graphlab/Dato /Turi之后也传闻使用它。
7)Torch的主要贡献者是Facebook、Twitter和Nvidia, Google Deep Mind也有一部分功劳。Torch按BSD 3开源许可发布,以非主流编程语言Lua实现,在员工熟练掌握之前很难提高整体效率,限制了其广泛应用。当前的版本Torch7提供了一个比Caffe更详尽的接口库,可以在上面非常方便地对已有模块实现逻辑复杂的调用。相比于Caffe, Torch7开放的接口更多,使用更灵活,很少会通过开发者给它实现新功能,而是依赖它去做扩展。但由于Lua语言本身功能偏弱,有点先天不足,所以Torch7不适合做层本身的组件开发。此外,Torch缺乏TensorFlow的分布式应用程序管理框架。
8)Deeplearning4J,简称DL4J,是用Java和Scala编写的、由Apache 2.0授权的开放源码,支持常用的机器学习向量化工具,以及丰富的深度学习模型,包括受限波耳兹曼机、深信度神经网络、卷积神经网络、循环神经网络、RNTN和长短期记忆网络等。DL4J是SkyMind的Adam Gibson的创意,是唯一与Hadoop和Spark集成的商业级深度学习框架,内置多GPU支持,可协调多个主机线程,使用Map-Reduce来训练网络,同时依靠其他库来执行大型矩阵操作。DL4J在Java中开源,本质上比Python快,速度与Caffe相当,可以实现多个GPU的图像识别、欺诈检测和自然语言处理等出色功能。
9)Keras是一个高层神经网络的应用程序编程接口(Application Programming Interface, API),由纯Python语言编写,并且使用TensorFlow、Theano或者CNTK作为后端。Keras的设计有4个原则:用户友好、模块性、易扩展性和与Python协作。用户友好是指Keras提供一致而简洁的API,以及清晰而有用的bug反馈,极大地减少了用户工作量。模块性是指Keras将网络层、损失函数、优化器、激活函数等方法都表示为独立的模块,作为构建各种模型的基础。易扩展性是指在Keras中只需要仿照现有的模块编写新的类或函数即可添加新的模块,非常方便。与Python协作是指Keras没有单独的模型配置文件,模型完全由Python代码描述,具有更紧凑和更易调试的优点。
如果读者想了解上述开发工具的更多信息和资料,可以访问下面的网址:
●http://www.deeplearning.net/software/theano/
●http://caffe.berkeleyvision.org
●https://developer.nvidia.com/caffe2
此外,必须介绍一下CUDA-convnet。这是一个C++/CUDA实现的高性能卷积神经网络库,其中甚至包括更一般的前馈神经网络。目前有CUDA-convnet和CUDA-convnet2两个版本。CUDA-convnet可以建立任意层的连通性和网络深度,实现任何有向无环图,使用反向传播算法进行训练,需要Fermi-generation GPU(GTX 4xx、GTX 5xx或者Teslax系列)。在CUDA-convnet的基础上,CUDA-convnet2主要做了3个改进。一是在Kepler-generation Nvidia GPU上提高了训练速度(Geforce Titan、K20、K40);二是实现了数据并行、模型并行和二者混合并行的方式[99];三是改进了不太友好的代码,完善了一些不完整的文档,而且仍在不断补充完善。CUDA-convnet和CUDA-convnet2的下载网址如下: