深度学习框架对比与选择

Posted 迷途书童小陋室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习框架对比与选择相关的知识,希望对你有一定的参考价值。

注:本文根据作者(想减肥的蓝胖纸)近一年对Deep Learning的了解和学习,汇总和对比了近年来比较流行的4大深度学习框架,为初学者选择某一框架提供一些建议。所说框架并无“最好”与“最坏”之分,选择最终归结于您的技术背景,需求和期望。

文章全文约3500字,包括5副图,阅读时间大约6分钟。

深度学习能做什么

近年来,随着海量数据的积累和计算机硬件计算能力的提升,深度学习越来越广泛应用在各个方面。我们来看看深度学习能做哪些有意思的事情:

  • 在计算机视觉领域,我们常用图像和视频数据来理解我们周围的世界。深度学习可以应用于图像分类(ResNet50),目标检测(Mask R-CNN),图像分割(UNET),图像恢复等领域。通俗一点讲,比如我们可以用神经网络对遥感图像进行分类,可以对人脸和车辆进行识别和检测,可以恢复损坏的照片,可以给照片自动着色,甚至直接从影像恢复三维信息。

  • 在自然语言处理领域,我们希望计算机能够理解、解译、掌握并转化我们人类的语言。深度学习能够处理音频和文本数据,可应用于语言翻译(GMNT谷歌翻译)、语音识别、语音合成、情感分析以及自然语言生成等领域。

  • 在医学领域,我们希望通过图像采集和图像解译的手段,准确评估和诊断疾病。深度学习可以应用于病变检测。比如利用CT,MRI,造影图像判断病人是否患有某种疾病。

  • 还有一些有意思的应用:

    • Face2Face:由美国斯坦福大学开发的一款可以让视频里的人跟着你说话的软件,该软件能够识别一个人说话时的动作和表情,并把这重现在另一个人的脸上,秒变名人不是梦。

    • Pix2pix:基于对抗神经网络 (GAN) 实现的图像翻译。简而言之就是将一幅图像翻译成另一幅图像。比如你可以输入一幅简笔画,或者一些色块,网络能够基于输入的原图像,润色创造出一副新的完整图像,让你秒变灵魂画手。

    • 自动书写生成:根据一些手写笔迹,利用深度学习技术就能用这些笔迹写出其他的词句,比如伦多大学的Alex Graves就教会了电脑用多种不同的风格来书写。

    • 自动识别图片文字,破解验证码,或者快速处理扫描件,生成电子文档。

    • 预测人幼年或老年时的外貌,可以帮助警方寻找失踪人口。

为何要用深度学习框架

如果您已经掌握了深度学习的核心算法,您当然可以使用Python或任何其他编程语言从头开始实现自己的神经网络模型。但是如果您需要实现更复杂的模型,如卷积神经网络(CNN)或循环神经网络(RNN)时,您会发现从头开始实现复杂模型是不切实际的,因此深度学习框架应运而生,它可以帮助您轻松实现您自己的神经网络:

  • 不需要手写CUDA 代码能跑GPU;

  • 容易构建大的计算图(computational graphs);

  • 自动实现计算图中的梯度计算;

  • 深度学习从此变得傻瓜;

掌握深度学习框架,前期要做哪些准备

  • 熟悉Python编程语言;

  • 掌握深度学习、神经网络基础知识,如前后向传播,梯度下降等算法

  • 需要了解框架的基本原理,学习并掌握框架的基本概念和用法:

    • 通常先从官方文档开始,浏览官方文档对框架基本概念和用法有一个大致的了解;

    • 结合官方提供的快速入门例子,在自己的机器上安装并练习使用;

    • 然后再从官方的模型库里面挑选一些算法,进行学习参考;

    • 结合自己具体任务组建网络,查看 API 接口文档,解决实际任务。

深度学习框架总结

常见的深度学习框架如下图所示。这些深度学习框架已被广泛应用于计算机视觉、语音识别、自然语言处理与生物信息学等领域,并获取了极好的效果。每一类框架都以不同的方式进行构建,具有不同的特点。

深度学习框架对比与选择

2018年9月,Jeff Hale(参考网站https://towardsdatascience.com/deep-learning-framework-power-scores-2018-23607ddf297a?gi=ba06d6aa4cca)根据公司招聘、调研报告、网络搜索、科研论文、教程文档、GitHub热度等数据,评估了2018年11种深度学习框架的影响力,如下图所示。本文主要介绍前四个最流行的主流框架 (TensorFlow, Keras, Pytorch, Caffe),希望能够帮助初学者选择适合的学习框架。限于笔者个人使用经验和了解程度,对各个框架的评价可能有不准确的地方。

深度学习框架对比与选择

TensorFlow

  • 概述

    2015年11月谷歌(Google)出品,基于Python和C++编写。GitHub上最热,谷歌搜索最多,使用人数最多(笔者也是其中之一),大多数网上招聘工作描述中也提到了它。由于Google在深度学习领域的巨大影响力和强大的推广能力,TensorFlow一经推出就获得了极大的关注,并迅速成为如今用户最多的深度学习框架。2019年3月已发布最新的TensorFlow2.0 版本。

    如果你最终想找一份深度学习的工作,最好学习下TensorFlow

    官方网站:https://www.tensorflow.org/

  • 优点

    • 自带tensorboard可视化工具,能让用户实时监控观察训练过程

    • 拥有大量的开发者,有详细的说明文档、可查询资料多

    • 支持多GPU、分布式训练,跨平台运行能力强

    • 具备不局限于深度学习的多种用途,还有支持强化学习和其他算法的工具

  • 缺点

    • 频繁变动的接口。TensorFlow的接口一直处于快速迭代之中,并且没有很好地考虑向后兼容性,这导致现在许多开源代码已经无法在新版的TensorFlow上运行,同时也间接导致了许多基于TensorFlow的第三方框架出现BUG

    • 接口设计过于晦涩难懂,在设计TensorFlow时,创造了图、会话、命名空间、PlaceHolder等诸多抽象概念,对初学者来说较难上手。(不过,据称新的2.0版本对接口设计有了重大改进,笔者也很期待)

    • 运行明显比其他框架速度慢


Keras

  • 概述

    Keras 于2015年3月首次发布,拥有“为人类而不是机器设计的API”,得到Google的支持。它是一个用于快速构建深度学习原型的高层神经网络库,由纯Python编写而成,以TensorFlow,CNTK,Theano和MXNet为底层引擎,提供简单易用的API接口,能够极大地减少一般应用下用户的工作量。

    如果你是深度学习的初学者,想要快速入门,建议从Keras开始。

    官方网站:https://keras.io/

  • 优点

    • 更简洁,更简单的API

    • 丰富的教程和可重复使用的代码

    • 更多的部署选项(直接并且通过TensorFlow后端),更简单的模型导出

    • 支持多GPU训练

  • 缺点

    • 过度封装导致丧失灵活性,导致用户在新增操作或是获取底层的数据信息时过于困难

    • 许多BUG都隐藏于封装之中,无法调试细节

    • 初学者容易依赖于 Keras 的易使用性而忽略底层原理


PyTorch

  • 概述

    PyTorch于2016年10月发布,是一款专注于直接处理数组表达式的低级API。 前身是 Torch(一个基于 Lua 语言的深度学习库)。Facebook 人工智能研究院对PyTorch提供了强力支持。 PyTorch 支持动态计算图,为更具数学倾向的用户提供了更低层次的方法和更多的灵活性,目前许多新发表的论文都采用PyTorch作为论文实现的工具,成为学术研究的首选解决方案。

    如果你是一名科研工作者,倾向于理解你的模型真正在做什么,那么就考虑选择PyTorch。

    官方网站:https://pytorch.org/

  • 优点

    • 简洁易用:更少的抽象,更直观的设计,建模过程简单透明,所思即所得,代码易于理解

    • 可以为使用者提供更多关于深度学习实现的细节,如反向传播和其他训练过程

    • 活跃的社区:提供完整的文档和指南,作者亲自维护的论坛供用户交流和求教问题。当然与Tensorflow相比,社区还是更小

    • 代码很Pythonic(简洁、优雅),更好的调试功能,默认的运行模式更像传统的编程,您可以使用常见的调试工具如pdb,ipdb或PyCharm调试器

  • 缺点

    • 无可视化接口和工具

    • 导出模型不可移植,工业部署不成熟

    • 代码冗余量较大


Caffe/Caffe2.0

  • 概述

    Caffe的全称是Convolutional Architecture for Fast Feature Embedding,它是一个清晰、高效的深度学习框架,于2013年底由加州大学伯克利分校开发,核心语言是C++。它支持命令行、Python和MATLAB接口。Caffe的一个重要特色是可以在不编写代码的情况下训练和部署模型。

    如果您是C++熟练使用者,并对CUDA计算游刃有余,你可以考虑选择Caffe

    官方网站:http://caffe.berkeleyvision.org/

  • 优点

    • 核心程序用C++编写,因此更高效,适合工业界开发

    • 网络结构都是以配置文件形式定义,不需要用代码设计网络

    • 拥有大量的训练好的经典模型(AlexNet、VGG、Inception)在其 Model Zoo里

  • 缺点

    • 缺少灵活性和扩展性:Caffe是基于层的网络结构,如果要实现一个新的层,用户必须要利用C++实现它的前向和后向传播代码。如果需要新层运行在GPU上,则同时还需要用户自己实现CUDA代码。这种限制使得不熟悉C++和CUDA的用户扩展Caffe十分困难

    • 依赖众多环境,难以配置,GitHub上基于Caffe的新的项目越来越少,已经很少用于学术界

    • 缺乏对递归网络RNN和语言建模的支持,不适用于文本、声音或时间序列数据等其他类型的深度学习应用

另外,Caffe2 于2017年由facebook团队发布,是一个兼具表现力、速度和模块性的开源深度学习框架。它沿袭了大量的 Caffe 设计,可解决多年来在 Caffe 的使用和部署中发现的瓶颈问题。但Caffe2仍然是一个不太成熟的框架,官网至今没提供完整的文档,安装也比较麻烦,编译过程时常出现异常,在GitHub上也很少找到相应的代码。

个人建议

如果您是初学者,掌握了Python的numpy、matplotlib等基础模块,考虑学习一个深度学习框架,我建议您从Keras开始,可以快速构建,训练和评估模型,而无需花费太多时间在数学实现细节上。

如果您已经掌握了Keras,并希望真正理解你的模型在做什么,或者您是科研工作人员,想借助工具实现您的idea开展研究,建议您选择易用灵活的PyTorch。

如果您想要熟练掌握需求量最大的框架,并且想从事深度学习相关工作,或者您从事工业场景应用和研发,建议您选择TensorFlow。

个人不太推荐用Caffe,尽管在极盛的时候,Caffe占据了计算机视觉研究领域的半壁江山。但在深度学习新时代到来之时,Caffe已经表现出明显的力不从心,诸多问题逐渐显现。如果您是Caffe重度使用者,建议关注Caffe2.0。

正如笔者前面所说,深度学习框架众多,并无最好与最坏之分。最重要的还是要深刻理解神经网络的基本概念,根据自己想要实现网络的类型,基于自己擅长的编程语言,考虑项目本身的特点和目标,选择最适合您的框架。最后,恭喜您走入深度学习的海洋,尽情遨游吧~


以上是关于深度学习框架对比与选择的主要内容,如果未能解决你的问题,请参考以下文章

五大主流深度学习框架对比:MXNET是最好选择

TensorFlow与主流深度学习框架对比

解读对比13个深度学习框架后的选择——专访TensorFlow贡献者黄文坚

从PyTorch到Mxnet ,对比7大Python深度学习框架

2018年11种深度学习框架影响力对比

开源深度学习框架对比