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那么灵活