文档乱、调试难…TensorFlow有那么多缺点,但为何我们依然待它如初恋?

简介: 作为谷歌AlphaGo背后的强大推动力,于2015年底开源的TensorFlow一经推出便受到极大关注。目前在所有机器学习框架中,如果它宣称使用普及率第二,没人敢说自己是第一。

作为谷歌AlphaGo背后的强大推动力,于2015年底开源的TensorFlow一经推出便受到极大关注。目前在所有机器学习框架中,如果它宣称使用普及率第二,没人敢说自己是第一。

虽说有谷歌的背书,社区好,资源多,但同学们在使用TensorFlow的过程中,常常会一不小心跳进坑里,严重影响体验。

近日一位同学就在知乎上提了一个问题【TensorFlow有哪些令人难以接受的地方?】,表达了TensorFlow在使用过程中的不便,顺便问了大家有没有什么更优雅的方法绕过那些坑。短短一个月的时间,该问题的浏览量已经达到10万+,关注者也达上千人。

文档乱、调试难&TensorFlow有那么多缺点,但为何我们依然待它如初恋?

作为问题的提出者,这位同学也试着抛砖引玉作了回答,他表示提出这个问题的初衷是希望引发大家对TF少一些盲目的推崇,多些理性的思考和进一步的讨论。而在全部42个回答中,雷锋网AI科技评论也总结了一些有意思的现象。

TensorFlow的“吐槽大会”

结合知乎上网友的回答,以及业内相关人士对TensorFlow的评价,AI科技评论整理了TensorFlow目前被“吐槽”频率比较高的一些问题。

  • 文档和接口混乱

    因为它的API发展太快,经常更新,所以有一些常用的函数方法会不断挪位置,例如rnn就从之前的nn接口移到contrib接口,写代码时需要常常翻阅文档。底层接口写起来繁琐,高层接口不灵活,且封装混乱。

  • 默认占用所有GPU的所有内存

    在实验过程中,并不是所有人都有多块GPU可用。tf在GPU不可用时会自动改在CPU上跑,这样一方面会导致速度变慢,另一方面,在共用显卡的情况下,你根本就不知道是在CPU上跑。虽说tf会打印设备信息,但是tf启动的时候输出的信息太杂了,没法每次都仔细看一遍。

  • 使用繁琐

    明明有其他更通用的模块能用,可事无巨细都要去使用tf的模块。例如虽然有默认的python库argparse可以用,但在很多tf示例代码中使用tf.app.flags。

  • 做流程控制非常难以理解

    语句中存在条件分支,例如当a>0时执行一步,a<0时执行另一步,如果有多层的这种条件嵌套会很难操作。

  • 调试困难

    TensorFlow作为静态图框架,api经常变,打印中间结果必须要借助Session运行才能生效,或者学习额外的tfdbg工具。而如果是用PyTorch这样的动态框架的话,就不需要多学一个额外的工具,只需要用正常的Python调试工具如ipdb就可以了。

综合看来,在使用TF的过程中,确实存在很多不够人性化的地方。不过,每个工具都不是完美的,虽说TF缺陷很多,但是对框架使用情况的统计数据最能说明问题,正所谓“TF虐我千万遍,我待TF如初恋”嘛。

TF普及率遥遥领先

下表为各个开源框架在GitHub上的数据统计(数据统计于 2017 年 9月 6 日),可以看到 TensorFlow 在 star 数量、fork 数量、contributor 数量这三个数据上都完胜其他对手。

文档乱、调试难&TensorFlow有那么多缺点,但为何我们依然待它如初恋?

此外,特斯拉AI负责人Andrej Karpathy2017年初通过分析过去五年arxiv上的论文数据,对比了各种深度学习框架的使用情况,看图说话:

下图是从2012年1月到2017年3月各框架的使用随时间的发展趋势。

文档乱、调试难&TensorFlow有那么多缺点,但为何我们依然待它如初恋?

下图对比了2017年3月在arxiv上提交的论文中提到深度学习框架的情况。

文档乱、调试难&TensorFlow有那么多缺点,但为何我们依然待它如初恋?

结合上面两张图,可以看到,自15年底谷歌开源TensorFlow以来,它的用户数增长稳定,而且一直处于高速的增长中,到17年3月,已经处于不可撼动的地位。(pytorch于2017年1月才开源,此处不做对比)

AI科技评论也总结了TensorFlow的几点优势。

  • 背靠谷歌这座大山,目前TensorFlow的文档最全,资源最多,很多模型都有tf的源码实现。而且用户基数庞大,一旦出问题很容易找到解决方案。

  • TensorFlow有功能强大的可视化组件TensorBoard,能可视化网络结构和训练过程,对于观察复杂的网络结构和监控长时间、大规模的训练很有帮助。

  • 虽然TensorFlow是静态图操作,会给调试带来困难,但会大大方便部署。除了caffe,目前还没有其他架构能支持静态图操作,但是caffe编程要比TF复杂。

而有意思的是,caffe作者贾扬清也在知乎上为TensorFlow正名。

他提到,TF是目前唯一一个在核心设计层面上支持dynamic control flow的框架,也是极少几个经历大规模多应用部署考验的框架之一。TensorFlow能直面实际应用中的限制条件,部署到真正核心的产品里面,它支持大规模推荐系统和移动端产品的部署,而这点对于很多框架来说没法实现。

“TF的确难,但是它给你提供了真正可以产品化的可能性。很多问题只看见一棵树的时候简单,看见森林的时候,解决方法就不一样了。”

细数完优点和缺点,问题来了。对于哪些实在忍受不了TensorFlow缺点的人,在考虑是否应该换个框架了。而对于那些还没入坑的同学,到底该用哪种框架?

当前主流框架大对比

主流框架的对比一直是个长期被讨论的话题,相关的帖子和文章也层出不穷。而在今年三月的斯坦福大学cs231n中,李飞飞、Justin Johnson和 Serena Yeung 也对当前几种主流框架进行了对比,并给出了建议。

文档乱、调试难&TensorFlow有那么多缺点,但为何我们依然待它如初恋?

文档乱、调试难&TensorFlow有那么多缺点,但为何我们依然待它如初恋?

  • TensorFlow虽然不完美,但是利于部署,有稳定的社群。此外它还拥有很多库,比如Keras和Sonnet等。

  • PyTorch很适合用于研究,但是它很新,因此你可能有很多坑要填。

  • 除了TensorFlow,caffe、caffe2也可以用于产品部署。

  • 手机端可以考虑TensorFlow或caffe2。

此外,北大的吴秉哲同学在知乎上也给出了很好的解答,他之前用Pytorch,Tensorflow,Mxnet这三个模型都做过项目,认为应该根据自己的需求选择模型。

  • 在需要快速验证一下自己某些想法的时候,我一般会用Pytorch快速实现,而且Pytorch的底层计算的代码是C写的,并且和Torch共用一套底层计算代码,想要阅读原码并做定制化修改比较容易上手。

  • 在做一些数据量比较大的long term的训练的时候,我会用tensorflow,比如它提供的tensorboard的训练监督,还有自带的profiling和debug功能比较方便,还有个原因就是它可以很方便的把模型deploy到手机上,现在caffe2出来了,或许可以是一个比较好的替代。

  • 另外选择框架的时候还得参考一下你所做的项目,比如做person re id大多数的工作都是基于caffe修改的,这个时候需要考虑迁移这些工作到其他框架下时不时会遇到坑。

  • 如果做物体定位,Mxnet已经提供了一些操作的高效实现。

他还强调,“现在框架迭代得也越来越快,mxnet在近期推出gluon的接口,API仿照Pytorch设计。不久之后Tensorflow也会有相应的接口推出。”

总结

很多同学在实验过程中,总是对框架过多考虑。这个框架的速度怎么样?好用程度程度怎么样?为什么文档这么乱?为什么用起来这么不顺手?随之而来就是一系列的吐槽。而他们往往忽略了最关键的东西,框架只是个手段,重要的是你想解决的是什么问题,以及你解决问题的思路。

此处借用贾扬清一句话,“框架就是个框架,最终要能出活。”



本文作者:Non
本文转自雷锋网禁止二次转载, 原文链接
目录
相关文章
|
3月前
|
机器学习/深度学习 TensorFlow API
TensorFlow与Keras实战:构建深度学习模型
本文探讨了TensorFlow和其高级API Keras在深度学习中的应用。TensorFlow是Google开发的高性能开源框架,支持分布式计算,而Keras以其用户友好和模块化设计简化了神经网络构建。通过一个手写数字识别的实战案例,展示了如何使用Keras加载MNIST数据集、构建CNN模型、训练及评估模型,并进行预测。案例详述了数据预处理、模型构建、训练过程和预测新图像的步骤,为读者提供TensorFlow和Keras的基础实践指导。
256 59
|
3月前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
158 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
3月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
53 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
|
3月前
|
机器学习/深度学习 人工智能 TensorFlow
TensorFlow 是一个由 Google 开发的开源深度学习框架
TensorFlow 是一个由 Google 开发的开源深度学习框架
51 3
|
3月前
|
机器学习/深度学习 自然语言处理 TensorFlow
TensorFlow:深度学习框架的领航者
**TensorFlow**是谷歌开源的机器学习框架,用于深度学习和大规模数据处理。它以数据流图为基础,支持分布式计算,提供高效、灵活且可扩展的环境。自2015年以来,经过多次升级,包括引入Eager Execution,提升了开发效率。TensorFlow广泛应用于图像识别、自然语言处理、推荐系统和语音识别等领域,其丰富的API和工具简化了模型构建,促进了深度学习的发展。【6月更文挑战第5天】
86 9
|
2天前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
12 0
|
11天前
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
23 0
|
20天前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
42 0
|
20天前
|
测试技术 数据库
探索JSF单元测试秘籍!如何让您的应用更稳固、更高效?揭秘成功背后的测试之道!
【8月更文挑战第31天】在 JavaServer Faces(JSF)应用开发中,确保代码质量和可维护性至关重要。本文详细介绍了如何通过单元测试实现这一目标。首先,阐述了单元测试的重要性及其对应用稳定性的影响;其次,提出了提高 JSF 应用可测试性的设计建议,如避免直接访问外部资源和使用依赖注入;最后,通过一个具体的 `UserBean` 示例,展示了如何利用 JUnit 和 Mockito 框架编写有效的单元测试。通过这些方法,不仅能够确保代码质量,还能提高开发效率和降低维护成本。
35 0
|
20天前
|
UED 开发者
哇塞!Uno Platform 数据绑定超全技巧大揭秘!从基础绑定到高级转换,优化性能让你的开发如虎添翼
【8月更文挑战第31天】在开发过程中,数据绑定是连接数据模型与用户界面的关键环节,可实现数据自动更新。Uno Platform 提供了简洁高效的数据绑定方式,使属性变化时 UI 自动同步更新。通过示例展示了基本绑定方法及使用 `Converter` 转换数据的高级技巧,如将年龄转换为格式化字符串。此外,还可利用 `BindingMode.OneTime` 提升性能。掌握这些技巧能显著提高开发效率并优化用户体验。
40 0

热门文章

最新文章