深度学习流行框架对比

Why TensorFlow?

下面将对比一下比较流行的几个深度学习框架,分别是Caffe、Theano、PyTorch、Tensorflow和Keras。希望能有利于你选用框架。

1.Caffe

第一个主流的生产级的深度学习库,始于2014年加州大学伯克利分校。

优点

  • 快速
  • 支持GPU
  • 良好的Matlab和Python接口

缺点

  • 不灵活。在Caffe中,每个节点都被视为一个层,如果想要定义一个新类型的层,要定义全部的前向、反向和梯度更新。这些层是构件块,而这里有无限的可供挑选的块列表(在Tensorflow中,每个节点都被视为张量运算,如矩阵加、乘或卷积。因此Tensorflow的构件块可以实现更多的模块化)。
  • 有很多冗余是不必要的。如果你想同时支持CPU和GPU,需要为每一种方案提供额外的实现。你还需要使用纯文本编辑器来自定义你的模型。实在是令人头疼!几乎每个人都更喜欢以编程的方式来定义模型,因为这样更方便不同组件之间的模块化。更有趣的是Caffe的主架构师现在在Tensorflow团队工作!
  • 框架并不通用,比较专注于计算机视觉(但这方面表示确实不错)。
  • 不是用Python编写的。如果需要添加新的改动,需要自己手工用C++和CUDA编程(对小改动,可以用Python或者Matlab的结构)。
  • 文档内容不怎样。
  • 安装有点难,有很多依赖需要解决。
  • 只接收少数的输入格式,只有一种输出格式,HDF5(虽然可以使用它的Python/C++/Matlab接口来运行,并从哪里获得输出数据)。
  • 对Recurrent Networks的支持并不友好

2.Theano

由蒙特利尔大学研究小组建立。在Theano之上建立了许多深度学习库,包括Keras、Lasagne和Blocks。Yoshua Bengio于2017年9月28日宣布,Theano将停止发展。 所以Theano实际上已经死了。

优点

  • 计算图这个抽象概念非常好(和Tensorflow一样)
  • 针对CPU和GPU进行了优化
  • 非常适合数值优化任务
  • 高级的封装(如Keras,Lasagne)缓解了种种蛋疼

缺点

  • 原生的Theano用了很老旧的低级API
import numpy
for _ in range(T):
    h=torch.matmul(W,h)+b
  • 模型比较大的时候编译时间很长
  • 不支持多路GPU
  • 提供的错误信息有时候并没有什么帮助

3.Pytorch

2017年1月Facebook开源Torch库的Python版本(由Lua编写)。

优点

  • 提供了动态的计算图(也就是运行时才建立),允许你提供可变长度的输入和输出,对于RNNs非常有用。
  • 在PyTorch中,可以用标准的Python语法编写for循环结构
  • 大量的预训练的模型
  • 很多非常容易结合的模块组件
  • 非常容易就可以编写自己的层类型以及在GPU上运行
  • Losswise是PyTorch中类似Tensorflow中的Tensorboard,并且提供了很多Tensorboard中没有的杀手级特征

缺点

  • 除了官方文档,相关的参考资源比较少
  • 商业支持不够

4.Tensorflow

是低级计算库,如Theano以及Blocks和Lasagne这样的更高级别的网络规范库的混合

优点

  • 由谷歌开发和维护,所以其支持和发展有比较好的保障
  • 非常庞大和活跃的社区
  • 有低级和高级的网络训练接口
  • Tensorboard是非常强大的可视化套件,可以记录网络的拓扑和表现,让调试更加简单
  • 是用Python编写的(有部分非常重要的接口是C++写的),这语言还是非常有吸引力的
  • 支持多GPU。可以自由地在不同的机器上运行,无需停止或者重启程序。
  • 模型的编辑比基于Theano的框架快
  • 编译速度也比Theano快
  • 不仅仅是深度学习,事实上它还有很多支持增强学习及其他算法的工具

缺点

  • 计算图是纯Python写的,所以有点慢
  • 计算图是静态的,意味着在运行前图就已经“编译好了”

5.Keras

级别更高,很多用户友好的API,具有可以配置的后端。是由Google Brain团体成员Francis Chollet编写和维护。(其实这里的级别我认为就是Python和C这两种语言的关系,一个更为抽象,功能的调用比较简洁,而一个更为底层,要考虑更多)

优点

  • 提供高级别的API来构建深度学习模型,非常容易读懂和使用
  • 很好的文档支持
  • 庞大、活跃的社区
  • 调用了其他深度学习库(如Theano和Tensorflow,可以配置)
  • 提供了面向对象的设计,一切都是对象(如层、参数、优化器等),所以所有的模型参数都可以通过对象的性质获取
    例如:
    model.layers[3].output可以得到模型的第三层
    model.layers[3].weights是一个象征权重张量的列表

缺点

  • 因为它非常通用,所以表现也会有所欠缺
  • 当用Tensorflow后端(backend)的时候有性能问题(虽然本来就没有进行优化),不过当用Theano后端的时候,表现就还可以
  • 不如Tensorflow或者PyTroch那么灵活

你可能感兴趣的:(deeplearning)