现如今开源生态非常完善,深度学习相关的开源框架众多,光是为人熟知的就有caffe,tensorflow,pytorch/caffe2,keras,mxnet,paddldpaddle,theano,cntk,deeplearning4j,matconvnet等。

本人一开始学习的时用的caffe,后来接触tensorflow、keras、mxnet、pytorch等,导致现在各个框架混乱,于是开始整理各个框架的学习,主要学习tensorflow、keras、mxnet、pytorch。下面介绍一下,这几个框架特点。

一、Caffe

github地址:https://github.com/BVLC/caffe

1、概述

Caffe是伯克利的贾扬清主导开发,以C++/CUDA代码为主,最早的深度学习框架之一,比TensorFlow、Mxnet、Pytorch等都更早,需要进行编译安装。支持命令行、Python和Matlab接口,单机多卡、多机多卡等都可以很方便的使用。目前master分支已经停止更新,intel分支等还在维护,caffe框架已经非常稳定。

2、caffe有很明显的优点和缺点

优点:

  • 以C++/CUDA/python代码为主,速度快,性能高。
  • 工厂设计模式,代码结构清晰,可读性和拓展性强。
  • 支持命令行、Python和Matlab接口,使用方便。
  • CPU和GPU之间切换方便,多GPU训练方便。
  • 工具丰富,社区活跃。

缺点:

  • 源代码修改门槛较高,需要实现前向反向传播,以及CUDA代码。
  • 不支持自动求导。
  • 不支持模型级并行,只支持数据级并行
  • 不适合于非图像任务。

二、Tensorflow

深度学习 架构 深度学习框架_深度学习 架构

github地址:https://github.com/tensorflow/tensorflow

1、概述

TensorFlow是Google brain推出的开源机器学习库,可用作各类深度学习相关的任务。

TensorFlow = Tensor + Flow,Tensor就是张量,代表N维数组,这与Caffe中的blob是类似的;Flow即流,代表基于数据流图的计算。

2、特点

TensorFlow最大的特点是计算图,即先定义好图,然后进行运算,所以所有的TensorFlow代码,都包含两部分:

(1) 创建计算图,表示计算的数据流。它做了什么呢?实际上就是定义好了一些操作,你可以将它看做是Caffe中的prototxt的定义过程。

(2)运行会话,执行图中的运算,可以看作是Caffe中的训练过程。只是TensorFlow的会话比Caffe灵活很多,由于是Python 接口,取中间结果分析,Debug等方便很多。

三、Keras

深度学习 架构 深度学习框架_github_02

github网址:https://github.com/keras-team/keras

1、概述

Keras是一个对小白用户非常友好而简单的深度学习框架,严格来说并不是一个开源框架,而是一个高度模块化的神经网络库。

Keras在高层可以调用TensorFlow,CNTK,Theano,还有更多的库也在被陆续支持中。 Keras的特点是能够快速实现模型的搭建,是高效地进行科学研究的关键。

2、特点

(1) 高度模块化,搭建网络非常简洁。

(2) API很简单,具有统一的风格。

(3) 容易扩展,只需使用python添加新类和函数。

四、Pytorch

深度学习 架构 深度学习框架_tensorflow_03

github地址:https://github.com/pytorch/pytorch

1、概述

一句话总结Pytorch = Python + Torch

Torch是纽约大学的一个机器学习开源框架,几年前在学术界非常流行,包括Lecun等大佬都在使用。但是由于使用的是一种绝大部分人绝对没有听过的Lua语言,导致很多人都被吓退。后来随着Python的生态越来越完善,Facebook人工智能研究院推出了Pytorch并开源。Pytorch不是简单的封装Torch 并提供Python接口,而是对Tensor以上的所有代码进行了重构,同TensorFlow一样,增加了自动求导。

后来Caffe2全部并入Pytorch,如今已经成为了非常流行的框架。很多最新的研究如风格化、GAN等大多数采用Pytorch源码。

2、特点

(1) 动态图计算。TensorFlow从静态图发展到了动态图机制Eager Execution,pytorch则一开始就是动态图机制。动态图机制的好处就是随时随地修改,随处debug,没有类似编译的过程。

(2) 简单。相比TensorFlow1.0中Tensor、Variable、Session等概念充斥,数据读取接口频繁更新,tf.nn、tf.layers、tf.contrib各自重复,Pytorch则是从Tensor到Variable再到nn.Module,最新的Pytorch已经将Tensor和Variable合并,这分别就是从数据张量到网络的抽象层次的递进。有人调侃TensorFlow的设计是“make it complicated”,那么 Pytorch的设计就是“keep it simple”。

五、Mxnet

深度学习 架构 深度学习框架_github_04

github地址:https://github.com/apache/incubator-mxnet

1、概述

Mxnet是由李沐等人领导开发的非常灵活,扩展性很强的框架,被Amazon定为官方框架。

2、特点

Mxnet同时拥有命令式编程和符号式编程的特点。在命令式编程上MXNet提供张量运算,进行模型的迭代训练和更新中的控制逻辑;在声明式编程中MXNet支持符号表达式,用来描述神经网络,并利用系统提供的自动求导来训练模型。Mxnet性能非常高,推荐资源不够的同学使用。

 

 

如何学习开源框架?

要掌握好一个开源框架,通常需要做到以下几点:

(1) 熟练掌握不同任务数据的准备和使用。

(2) 熟练掌握模型的定义。

(3) 熟练掌握训练过程和结果的可视化。

(4) 熟练掌握训练方法和测试方法。

如何选择框架呢?

(1) 不管怎么说,tensorflow/pytorch你都必须会,这是目前开发者最喜欢,开源项目最丰富的两个框架。

(2) 如果你要进行移动端算法的开发,那么Caffe是不能不会的。

(3) 如果你非常熟悉Matlab,matconvnet你不应该错过。

(4) 如果你追求高效轻量,那么darknet和mxnet你不能不熟悉。

(5) 如果你很懒,想写最少的代码完成任务,那么用keras吧。

(6) 如果你是java程序员,那么掌握deeplearning4j没错的。