本节对5个开源深度学习结构进行比照研讨,首要侧重于3个维度研讨:硬件支撑率、速度和准确率、社区活泼性。他们别离是:TensorFlow、Caffe、Keras、Torch、DL4j 。
2.3.1 硬件支撑率
本节研讨的硬件运用率指不同开源深度学习结构关于不同CPU/GPU装备下对硬件的支撑功率与通用功能体现。
表2.1展现了各结构关于不同硬件的通用支撑功能。
2.3.2 速度和准确率
本节将梯度核算时刻、前馈传达和反响传达时刻总和衡量,不对各项进行细分。且一切试验数据根据CPU。
模型
本节选取全链接神经网络(Fully Connected Neural Network, FCNN)作为深度学习结构速度测验模型。FCNN被视为前馈多层感知网络,意味着网络神经元之间的衔接是单向的,不包括环状衔接,因而简略取得时刻数据。FCNN最首要的用处在于进行数据分类作业,因而合适对不同结构下的准确率进行比照。
数据集
本节选取MNIST手写数字图片集作为FCNN的数据集对不同结构进行测验。MNIST数据集由6000张练习图画集和1000张测验图画集组成,均为28X28像素的手写数字图片。
测验办法
本节方针在于比照测验FCNN类型的神经网络在不同结构上的收敛所耗时刻以及预练习网络在不同结构上关于分类成果猜测的准确性。首要调查以下方面:1.收敛速度;2.猜测耗时;3.分类准确性;4.源代码规划;
为了评价模型的可扩展性,选用不同的扩展性因子来衡量上述1-3点。神经网络结构选用两种标准进行测验:1.运用相同的神经元数来改动网络的“深度”(见图2.10);2.运用相同的层数来改动网络的“宽度”(见图2.11);
图2.9 “深度”改动了的神经网络
图2.10 “宽度”改动了的神经网络
测验成果
图2.11-图2.14展现了FCNN根据各结构使 用Tanh非线性激活函数的状况下的练习时刻、猜测时刻和分类准确度。一切试验的Epoch设定为10。
图2.11 根据Tanh激活的FCNN在改动“深度”状况下的练习时刻
图2.12 根据Tanh激活的FCNN在改动“深度”状况下的猜测时刻
图2.13 根据Tanh激活的FCNN在改动“深度”状况下的分类准确率
相似的,图2.14-图2.16展现了FCNN根据各结构运用ReLU非线形激活函数的状况下的练习时刻。
图2.14 根据ReLU激活的FCNN在改动“深度”状况下的练习时刻
图2.15 根据ReLU激活的FCNN在改动“深度”状况下的猜测时刻
图2.16 根据ReLU激活的FCNN在改动“深度”状况下的分类准确率
下面的试验调查当网络隐含层的尺度(如神经元个数)如图2.10的办法改动时,FCNN在不同结构上的速度、准确率的改动状况。试验成果别离于图2.17-图2.19种一相同的办法被展现。
图2.17 根据ReLU激活的FCNN在改动“宽度”状况下的练习时刻
图2.18 根据ReLU激活的FCNN在改动“宽度”状况下的猜测时刻
图2.19 根据ReLU激活的FCNN在改动“宽度”状况下的分类准确率
咱们结合相关算法完成的代码量与接口言语来衡量深度学习结构的复杂度。各结构的复杂度比照见表2.1和图2.20所示。
表2.1 各结构的复杂性
图2.20 复杂性的代码行体现
2.3.3 社区活泼度
速度是衡量源深度学习结构功能的一个重要目标,一起,对各开源深度学习结构的贡献者数量和开源社区的活泼度也平等重要。不管关于学术研讨或是工业项目开发与布置,社区活泼度与常识获取与开发本钱联系非常亲近。
GitHub社区项目的Watch、Star、Fork数量可反映出各深度学习结构的活泼度(如图2.21-2.23所示)。其间Watch反响了各结构的浏览量,Star数量代表社区运用者对结构的点赞数,Fork则指结构被复制的数量。
图2.21 GitHub社区各开源深度学习结构的Watch数
图2.22 GitHub社区各开源深度学习结构的Star数
图2.23 GitHub社区各开源深度学习结构的Fork数
当跳出深度学习结构自身,在GitHub检索根据各结构的项目、笔记、评论时,图2.24-图2.26展现出了根据各结构的项目的活泼状况。
图2.24 GitHub社区根据各开源深度学习结构的repositories
图2.25 GitHub社区根据各开源深度学习结构的Commits
图2.26 GitHub社区根据各开源深度学习结构的Commits
2.3.3 工业体现才能
开源深度学习结构不仅对学术研讨供给了有力的支撑,一起也为工业界处理使命供给了许多处理方案。本节将从模型表达才能、接口、布置、功能和架构等方面衡量各开源结构在工业出产范畴的体现。
图2.27 各结构支撑言语
表2.2 各结构工业才能评分(GitHub)
网络和模型才能
Caffe在核算机视觉范畴是最盛行的工具包,有许多扩展,但对递归网络和言语建模的支撑很差。此外,在Caffe中图层需求运用C++界说,而网络则运用Protobuf界说。
TensorFlow是一个抱负的RNN API和完成,向量运算的图办法使得新网络的指定变得适当简略,但其并不支撑双向RNN和3D卷积,一起公共版别的图界说也不支撑循环和条件操控,这使得RNN的完成并不抱负,由于有必要要运用Python循环且无法进行图编译优化。
Theano支撑大部分先进的网络,许多研讨主意都来源于Theano,它引领了符号图在编程网络中运用的趋势。Theano的符号API支撑循环操控,让RNN的完成愈加简略且高效。
Torch对卷积网络的支撑非常好,经过时域卷积的本地接口使得它的运用非常直观。Torch经过许多非官方的扩展支撑很多的RNN,一起网络的界说办法也有许多种。但Torch本质上是以图层的办法界说网络的,这种粗粒度的办法使得它对新图层类型的扩展短少满足的支撑。与Caffe比较,在Torch中界说新图层非常简略,不需求运用C++编程,图层和网络界说办法之间的差异最小。
接口
Caffe支撑pycaffe接口,但这仅仅是用来辅佐命令行接口的,而即使是运用pycaffe也有必要运用protobuf界说模型。
TensorFlow支撑Python和C++两种类型的接口。用户能够在一个相对丰厚的高层环境中做试验并在需求本地代码或低推迟的环境中布置模型。
Theano支撑Python接口。
Torch运转在LuaJIT上,与C++、C#以及Java等工业言语比较速度非常快,用户可编写恣意类型的核算而不需求忧虑功能,但Lua并非干流言语。
模型布置
Caffe根据C++,可在多种设备上编译,具有跨渠道性,是布置项目的最佳挑选。
TensorFlow支撑C++接口,一起能够根据ARM架构编译和优化。用户可将老练模型布置在多种设备上而不需完成独自的模型解码器或许加载Python/LuaJIT解说器。
Theano短少底层的接口,而且其Python解说器也很低效。
Torch的模型运转需求LuaJIT的支撑,对集成造成了很大的妨碍。
功能
Caffe 简略快速。
TensorFlow仅运用了cuDNN v2,但即使如此它的功能仍然要比相同运用cuDNN v2的Torch要慢1.5倍,而且在批巨细为128时练习GoogleNet还呈现了内存溢出的问题。
Theano在大型网络上的功能与Torch7平起平坐。但其因需求将C/CUDA代码编译成二进制而发动时刻过长。此外,Theano的导入也会耗费时刻,而且在导入之后无法脱节预装备的设备。
Torch非常好,没有TensorFlow和Theano的问题。
架构
Caffe的首要下风是图层需求运用C++界说,而模型需求运用protobuf界说。此外,假如想要支撑CPU和GPU,用户还有必要完成额定的函数;关于自界说的层类型,还须为其分配id,并将其添加到proto文件中。
TensorFlow的架构明晰,选用了模块化规划,支撑多种前端和履行渠道。
Theano 的整个代码库都运用Python,连C/CUDA代码也要被打包为Python字符串,这使其难以导航、调试、重构和保护。
Torch7和nn类库具有明晰的规划和模块化的接口。
2.2.4 定论
1. 各深度学习结构关于硬件的运用状况:
多线程CPU的状况下Torch运用的最广泛;
TensorFlow在多GPU的条件下最为灵敏可用;
2. 各深度学习结构关于速度:
在网络“深度”改动的状况下,Keras具有最快的练习速度,TensorFlow具有最快的猜测响应速度;
在网络“宽度”改动的状况下,Caffe具有最快的练习速度,TensorFlow在“宽度”改动较小的状况下具有最快的猜测响应速度,“宽度”改动较大时Keras具有最快的响应速度,TensorFlow紧随其后;
3. 各深度学习结构关于准确率:
在网络“深度”改动的状况下,TensorFlow和Torch的分类准确率随网络“深度”的添加而下降;
在网络“宽度”改动的状况下,TensorFlow的分类猜测准确率相对安稳,逾越CaffeTorch;
不管在网络“深度”或是“宽度”改动的状况下,Keras对分类猜测的准确率非常安稳,且逾越其他结构,具有最佳的猜测准确率;
4. 各深度学习结构的社区活泼度:
TensorFlow能够界说为“最盛行”、“最被认可”的开源深度学习结构。其在GitHub上不管是Star数、Fork数,或是检索根据TensorFlow的项目数,都大大逾越其他结构,乃至逾越其他结构资源的总和。
5. 各深度学习结构的工业表达才能:
Caffe具有优异的模型表达才能和工业布置才能,尤其是核算机视觉方面,但对RNN和言语建模的支撑很差。Caffe适用于视觉使命处理,尤其是根据深度学习的工业项目,其具有无可争议的出产安稳性;但其短少灵敏性,这使得对网络结构的改动比其他结构费事,且Caffe的文档非常匮乏,代码阅览困难高于其他结构。
Tensorflow具有很好的模型表达才能、优异的接口和明晰的内部结构,适用于工业项目布置,但其速度功能不具备优势;TensorFlow支撑分布式核算,使得硬件设备的功能得到最充分发挥;其代码的可读性和社区活泼度使得不管是学术研讨或工业出产变得简略;
Keras具有杰出的速度功能、模型表达才能,运用简练、便利—只需几行代码就能构建一个神经网络。Keras具有完好的文档,使得学习和运用非常简略—即使不熟悉Python。其更适用于学术研讨、试验或轻量级工业使命(如获取特征值);
Torch具有非常优异的速度功能,但其运用Lua言语;
DL4j兼容JVM,也适用 Java、Clojure和 Scala;