Caffe、TensorFlow、MXnet三个开源库对比

最近Google开源了他们内部使用的深度学习框架TensorFlow[1],结合之前开源的MXNet[2]和Caffe[3],对三个开源库做了一些讨论,其中只有Caffe比较仔细的看过源代码,其他的两个库仅阅读官方文档和一些研究者的评论博客有感,本文首先对三个库有个整体的比较,再针对一些三者设计的不同数据结构、计算方式、gpu的选择方式等方面做了比较详细的讨论。表格1是三者的一些基本情况的记录和比较。其中示例指的是官方给出的example是否易读易理解,因为TensorFlow直接安装Python包,所以一开始没有去下源代码,从文档中找example不如另外两个下源码直接。实际上TensorFlow更加像一套独立的python接口,它不止能够完成CNN/RNN的功能,还见到过有人用它做Kmeans聚类。这个表主观因素比较明显,仅供参考。

(2016年6月27日更新)大半年的时间过去了,再回过头来看这篇文章,感觉有点伤感,Caffe已经很久没有更新过了,曾经的霸主地位果然还是被tensorflow给终结了,特别是从0.8版本开始,tensorflow开始支持分布式,一声叹息…MXNet还是那么拼命,支持的语言新增了四种,Matlab/Javascripts/C++/Scala,文档也变的更漂亮了,还推出了手机上图片识别的demo[8]。

(原文如下)

库名称开发语言支持接口安装难度(Ubuntu)文档风格示例支持模型上手难易
Caffe   c++/cuda   c++/python/matlab   *   *   *   CNN   **  
MXNet   c++/cuda   python/R/Julia   **   *   **   CNN/RNN   *  
TensorFlow   c++/cuda/python   c++/python   *   **   *   CNN/RNN/…   *  

安装难度: (简单) –> **(复杂)

文档风格: (一般) –> **(好看、全面)

示例: (给的少) –> **(给的多、全)

上手难易: (易) –> **(难)

1.基本数据结构 库名称数据结构名称设计方式
Caffe   Blob   存储的数据可以看成N维的c数组,有(n,k,h,w)四个维数,一个blob里面有两块数据空间保存前向和后向求导数据  
MXNet   NDArray   提供cpu/gpu的矩阵和矢量计算,能够自动并行  
TensorFlow   tensor   相当于N维的array或者list,维数可变,数据类型一旦定义不能改变  

caffe的数据存储类blob,当把数据可以看成是一个N维的c数组,它们的存储空间连续。例如存储图片是4维(num, channel, height, width),变量(n,k,h,w)在数组中存储位置为((n*K+k)*H+h)*W+w。blob有以下三个特征[4]:

两块数据,一个是原始data,一个是求导值diff

两种内存分配方式,一种是分配在cpu上,一种是分配在gpu上,通过前缀cpu、gpu来区分

两种访问方式,一种是不能改变数据,一种能改变数据

Caffe最让我觉得精妙的地方在于一个blob保存前向和后向的数据。虽然就代码本身而言,前向数据是因为输入数据不同而改变,后向求导是因为求导不同而改变,根据SRP原则,在一个类里面因为两个原因而改变了数据这种是不合适的设计。但是从逻辑层面,前向数据的改变引起了反向求导的不同,它们实际上是一起在改变,本身应该是一个整体。所以我很喜欢这个设计,虽然基本上其他框架中都是将两个数据给分离出来,caffe2也不知是否保留。

MXNet的NDArray类似numpy.ndarray,也支持把数据分配在gpu或者cpu上进行运算。但是与numpy和caffe不同的是,当在操作NDArray,它能自动的将需要执行的数据分配到多台gpu和cpu上进行计算,从而完成高速并行。在调用者的眼中代码可能只是一个单线程的,数据只是分配到了一块内存中,但是背后执行的过程实际上是并行的。将指令(加减等)放入中间引擎,然后引擎来评估哪些数据有依赖关系,哪些能并行处理。定义好数据之后将它绑定到网络中就能处理它了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7d497ffbc910cfd733c793984695a1bd.html