1.Caffe
Caffe是一个清晰而高效的深度学习框架,也是一个被广泛使用的开源深度学习框架,在Tensorflow出现之前一直是深度学习领域Github star最多的项目。主要优势为:上手容易,网络结构都是以配置文件形式定义,不需要用代码设计网络。训练速度快,组件模块化,可以方便的拓展到新的模型和学习任务上。但是Caffe最开始设计时的目标只针对于图像,没有考虑文本、语音或者时间序列的数据,因此Caffe对卷积神经网络的支持非常好,但是对于时间序列RNN,LSTM等支持的不是特别充分。Caffe工程的models文件夹中常用的网络模型比较多,比如Lenet、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等。
Caffe依赖了大量的第三方库
(1)为了读取图像,以及简单的图像处理,链接很重的OpenCV库
(2)boost来实现—些C++ 11的特征
(3) HD5/LMDB/LEVELDB 用来做数据的IO
(4)ProtoBuffer 使用随处可见
Caffe由低到高依次把网络中的数据抽象成Blob, 各层网络抽象成Layer ,整个网络抽象成Net,网络模型的求解方法抽象成Solver。基于层的设计思路:
Blob 模块:实现了Tensor的功能,保存数据和梯度值
Layer 模块:根据输入(bottom)blog计算输出(top)blob,同时保存权重/梯度
Net 模块:由多个layer组成, 实现forward/backward计算
Solver 模块:最优化模块,利用梯度值更新权重
因为 Caffe 的底层是基于 C++的,因此可以在各种硬件环境编译并具有良好的移植性,支持 Linux、Mac 和 Windows 系统,也可以编译部署到移动设备系统如 Android 和 iOS 上。和其他主流深度学习库类似,Caffe 也提供了 Python 语言接口 pycaffe,在接触新任务,设计新网络时可以使用其 Python 接口简化操作。不过,通常用户还是使用 Protobuf 配置文件定义神经网络结构,再使用 command line 进行训练或者预测。Caffe 的配置文件是一个 JSON 类型的 .prototxt 文件,其中使用许多顺序连接的 Layer 来描述神经网络结构。Caffe 的二进制可执行程序会提取这些 .prototxt 文件并按其定义来训练神经网络。理论上,Caffe 的用户可以完全不写代码,只是定义网络结构就可以完成模型训练了。Caffe 完成训练之后,用户可以把模型文件打包制作成简单易用的接口,比如可以封装成 Python 或 MATLAB 的 API 。不过在 .prototxt 文件内部设计网络节构可能会比较受限,没有像 TensorFlow 或者 Keras 那样在 Python 中设计网络结构方便、自由。更重要的是,Caffe 的配置文件不能用编程的方式调整超参数,也没有提供像 Scikit-learn 那样好用的 estimator 可以方便地进行交叉验证、超参数的 Grid Search 等操作。Caffe 在 GPU 上训练的性能很好(使用单块 GTX 1080 训练 AlexNet 时一天可以训练上百万张图片),但是目前仅支持单机多 GPU 的训练,没有原生支持分布式的训练。庆幸的是,现在有很多第三方的支持,比如雅虎开源的 CaffeOnSpark,可以借助 Spark 的分布式框架实现 Caffe 的大规模分布式训练。
Caffe 的训练
需要提前做数据准备,保存为LMDB/LevelDB等格式
不用编写C++代码,直接编写 .prototxt 定义 net对象
直接编写.prototxt 定义 solver 对象
通过参数直接执行 caffe 命令进行训练
第—步:数据准备
准备数据文件:
xx/xx/xx.jpg label ##每行都是这样的格式
通过tools/create_xxxx 命令生产 LMDB/LevelDB等格式的数据文件
第二步:编写网络文件
规则简单的,可以直接用文本编辑器生成
网络结构复杂的,利用Python脚本生成
注意net prototxt文件描述的是有向无环图
第三步:定义solver文件
简单手动编写
设置好需要的参数
第四步:训练
生产环境的Caffe
依赖库裁剪
性能优化
主要特点
C++
技术细节全面采用C++实现
依赖proto buffer/boost开发库
GPU加速采用cuda开发
OpenCV/LMDB等仅仅只是补充功能,并不是核心模块
Layer based
采用DSL定义网络结构
layer/blob/net/solver 等结构
优点/缺点
2.Torch
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 那么多。
主要特点概括
灵活的框架
使用Lua语言做为控制应用层,彻底的模块化设计
友好的交互
快速学习深度学习中各个组件的功能
全程可控的训练过程
适合实验新的网络类型
Torch优缺点概括
(-) Lua
(-) Less plug-and-play than Gaffe
o You usually write your own training code
(+) Lots of modular pieces that are easy to combine
(+) Easy to write your own layer types and run on GPU
(+) Most of the library code is in Lua, easy to read
(+) Lots of pretrained models!
(-) Not great for RNNs
3.TensorFlow
https://www.leiphone.com/news/201702/T5e31Y2ZpeG1ZtaN.html,http://www.tensorfly.cn/tfdoc/api_docs/python/nn.html#top_k
目前的2.0版更加简洁高效,当然也有人觉得调试不是很顺利,必定是新的开源,相信以后会越来越强健稳定。
优点/缺点
4.MxNet
MXNet 是 DMLC(Distributed Machine Learning Community)开发的一款开源的、轻量级、可移植的、灵活的深度学习库,它让用户可以混合使用符号编程模式和指令式编程模式来最大化效率和灵活性,目前已经是 AWS 官方推荐的深度学习框架。MXNet 的很多作者都是中国人,其最大的贡献组织为百度,同时很多作者来自 cxxnet、minerva 和 purine2 等深度学习项目,可谓博采众家之长。它是各个框架中率先支持多 GPU 和分布式的,同时其分布式性能也非常高。MXNet 的核心是一个动态的依赖调度器,支持自动将计算任务并行化到多个 GPU 或分布式集群(支持 AWS、Azure、Yarn 等)。它上层的计算图优化算法可以让符号计算执行得非常快,而且节约内存,开启 mirror 模式会更加省内存,甚至可以在某些小内存 GPU 上训练其他框架因显存不够而训练不了的深度学习模型,也可以在移动设备(Android、iOS)上运行基于深度学习的图像识别等任务。此外,MXNet 的一个很大的优点是支持非常多的语言封装,比如 C++、Python、R、Julia、Scala、Go、MATLAB 和 JavaScript 等,可谓非常全面,基本主流的脚本语言全部都支持了。在 MXNet 中构建一个网络需要的时间可能比 Keras、Torch 这类高度封装的框架要长,但是比直接用 Theano 等要快。
总结
|
Caffe |
Torch |
TensorFlow |
MxNet |
Language |
C++, Python |
Lua |
Python,C++ |
C++, Python |
Pretrained |
Yes ++ |
Yes ++ |
Inception |
|
Multi-GPU: Data parallel |
Yes |
Yes cunn. DataParallelTable |
Yes |
YES |
Multi-GPU: Model parallel |
No |
Yes fbcunn.ModelParallel |
Yes (best) |
YES |
Readable source code |
Yes (C++) |
Yes (Lua) |
No |
YES(C++ 11) |
Good at RNN |
No |
Mediocre |
Yes (best) |
YES |