1. Caffe
LeNet→神经网经
Caffe的优点是简洁、快速,缺点是缺少灵活性。Caffe灵活性的缺失主要是因为它的设计缺陷。在Caffe 中最主要的抽象对象是层,每实现一个新的层,必须要利用C++实现它的前的传播和反向传播代码;而如果想要新的层运行在GPU上,还需要同时利用CUDA实现这一层的前向传播和反向传播。这种限制使得不熟悉C++和CUDA的用户扩展Caffe十分困难。
Caffe 凭借其易用性、简洁明了的源码、出众的性能和快速的原型设计获取了众多用户,曾经占据深度学习领域的“半壁江山”。但是在“深度学习新时代”到来之时,Caffe已经表现出应用局限等。明显的力不从心,诸多问题逐渐显现,包括灵活性缺失、扩展难、依赖众多环境且难以配置尽管现在在GitHub上还能找到许多基于Caffe的项目,但是新的Caffe的项目己经越来越少。
Caffe的作者从加州大学伯克利分校毕业后加入了Google公司,参与过TensorFlow 的开发后来离开Google公司加入FAIR公司,担任工程主管,并开发了Caffe2。Caffe2是一个兼具表现力、速度和模块性的开源深度学习框架。它沿袭了大量的Caffe设计,可解决多年来在Caffe的使用和部署中发现的瓶颈问题。Caffe2的设计追求轻量级,在保有扩展性和高性能的同时,Caffe2 也强调了便携性。Caffe2从一开始就以性能、扩展、移动端部署作为主要设计目标。Caffe2的核心 C++库能提供高速和便携性,而其Python 和 C++API 使用户可以轻松地在Linux、Windows、iOS、Android,甚至Raspberry Pi和NVIDIA Tegra 上进行原型设计、训练和部署。
Caffe2 继承了Caffe的优点,在速度上令人印象深刻。FAIR与应用机器学习团队合作,利用Caffe2大幅加速机器视觉任务的模型训练过程,仅需1小时就训练完ImageNet这样超大规模的数据集。然而尽管开发已超过一年,Caffe2仍然是一个不太成熟的框架,官网至今未提供完整的文档,其安装也比较麻烦,编译过程时常出现异常,在GitHub上也很少找到相应的代码。
“极盛”的时候,Caffe 占据了计算机视觉研究领域的一半,虽然如今Caffe已经很少用于学术界,但是仍有不少计算机视觉相关的论文使用Caffe。由于其稳定、出众的性能,不少公司还在使用Caffe部署模型。Caffe2尽管做了许多改进,但是还远没有达到替代Caffe的地步。
2. TensorFlow
在很大程度上,TensorFlow 可以看作Theano的后继者,它们不仅有很大一批共同的开发者,而且拥有相近的设计理念,都是基于计算图实现自动微分系统。TensorFlow 使用数据流图进行数值计算,节点代表数学运算,而边则代表在这些节点之间传递的多维数组(张量)。
TensorFlow 编程接口支持Python 和C++。随着 1.0版本的公布,Java、Go、R和HaskellAPI的 alpha 版本也被支持此外,TensorFlow 还可在Google Cloud 和 AWS 中运行。TensorFlow还支持Windows 7、Windows 10和 Windows Server 2016。由于TensorFlow 使用C++Eigen库,所以库可在 ARM架构上编译和优化。这也就意味着用户可以在各种服务器和移动设备上部署自己的训练模型,无须执行单独的模型解码器或者加载Python解释器。
作为当前最流行的深度学习框架之一,TensorElow获得子极大的成功,但对它的批判也不绝于耳,总结起来主要有以下4点。
(1)过于复杂的系统设计。TensorFlow 在GitHub代码仓库的总代码量超过100万行。这么大的代码仓库,对于项目维护者来说,维护成了一个难以完成的任务;而对读者来说,学习TensorFlow 底层运行机制更是一个极其痛苦的过程,并且大多数时候这种尝试以放弃告终。
(2)频繁变动的接口。TensorFlow的接口一直处于快速迭代之中,并且没有很好地考虑向后兼容性,这导致现在许多开源代码已经无法在新版的TensorFlow上运行,也间接导致了许多基于 TensorFlow 的第三方框架出现bug。
(3)难以理解的概念。由于接口设计过于晦涩难懂,所以在设计 TensorFlow时,创造了图、会话、命名空间、PlaceHolder等诸多抽象概念,对普通用户来说难以理解。同一个功能,TensorFlow 提供了多种实现,这些实现使用中还有细微的区别,很容易将用户带入“坑”中。
(4)文档和教程缺乏明显的条理和层次。作为一个复杂的系统,TensorFlow只考虑到文档的全面性,而没有为用户提供一不真正循序渐进的人门教程。
由于直接使用TensorFlow 的生产力过干低下,包括Google 官方等众多开发者尝试基于TensorFlow 构建一个更易用的接口,Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等第三方框架每隔几个月就会被报道一次,但是大多又归于沉寂。至今TensorFlow 仍没有一个统一易用的接口。
凭借Google公司强大的推广能力,TensorFlow已经成为当今“炙手可热”的深度学习框架,但是由于自身的缺陷,TensorFlow 离最初的设计目标还很遥远。另外,由于Google 公司对TensorFlow 略显严格的把控,目前各大公司都在开发自己的深度学习框架。
3. PyTorch
PyTorch 是当前难得的简洁、优雅且高效、快速的框架。PyTorch 的设许道求最少的封装,.尽量避免“重复造轮子”。不像TensorFlow 中充斥着 session、graph、operation、name scope、variable、tensor 等全新的概念,PyTorch的设计遵循tensor→variable(autograd)→→nn.Module这3个低到高的抽象层次,分别代表高维数组(张量)、自动求导(变量)和神经网络(层/模块),而且这3个抽象之间联系紧密,可以同时进行修改等操作。
简洁的设计带来的另外一个好处就是代码易于理解。PyTorch 的源码只有 TensorFlow 的十分之一左右,更少的抽象、更直观的设计使得 PyTorch 的源码十分易于阅读和理解。
PyTorch的灵活性不以降低速度为代价。在许多评测中,PyTorch 的速度表现胜过TensorFlow 和Keras 等框架。框架的运行速度和程序员的编码水平有极大关系,但同样的算法,使用PyTorch实现的更有可能快过用其他框架实现的。
同时,PyTorch 是所有的框架中面向对象设计的最优雅的一个。PyTorch的看向对象的接口设计来源子Torch)而Torch的接口设计以灵活、易用而著称,Keras作者最初就是受Torch的启发才开发了Keras。PyTorch 继承了Torch的“衣钵”,尤其是API的设计和模块的接口都与Torch 高度一致。PyTorch的设计更符合人们的思维,它让用户尽可能地专注于实现自己的想法,即“所思即所得”,不需要考虑太多关于框架本身的束缚。
PyTorch 提供了完整的文档、循序渐进的指南,作者亲自维护的论坛供用户交流和学习,FAIR对PyTorch 提供了强力支持,作为当今排名前三的深度学习研究机构,FAIR的支持足确保PyTorch获得持续的开发和更新。
在PyTorch推出不到一年的时间内,利用PyTorch实现的各类深度学习问题的解决方案诗渐在GitHub 上开放。同时也有许多新发表的论文采用PyTorch作为论文实现的工具,PyTor正在受到越来越多人的“追捧”。如果说 TensorFlow 的设计是“Make It Complicated”,Kera的设计是“Make It Complicated And Hide It”,那么PyTorch的设计真正做到了“Keep it Simple Stupid"。
但是同样地,由于推出时间较短,PyTorch在GitHub上并没有如Caffe或TensorFlow 那样多的代码实现。使用TensorFlow 能找到很多别人的代码,而对于PyTorch的使用者,很多的代码实现可能需要自己完成。
本节介绍了3种常用的机器学习框架,其中TensorFlow 和 PyTorch是目前较流行的两种开源框架。在以往版本的实现中,TensorFlow 主要提供静态图构建的功能,因此具有较高的运算性能,但是模型的调试分析成本较高。PyTorch主要提供动态图计算的功能,API设计接近Python原生语法,因此易用性较好,但是在优化方面不如TensorFlow。这导致TensorFlow大量用于人工智能(Artificial Intelligence,AI)企业的模型部署,而学术界大量使用PyTorch进行研究。不过目前我们也看到两种框架正在“吸收”对方的优势,例如TensorFlow的eager模式就是对动态图的一种尝试。另外,目前也有许多独具特色的机器学习框架,如PaddlePaddle MXNet、XGBoost等,有兴趣的读者可以深入了解。