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

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

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

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

作为问题的提出者,这位同学也试着抛砖引玉作了回答,他表示提出这个问题的初衷是希望引发大家对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 数量这三个数据上都完胜其他对手。

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

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

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

结合上面两张图,可以看到,自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虽然不完美,但是利于部署,有稳定的社群。此外它还拥有很多库,比如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

本文转自雷锋网禁止二次转载,原文链接

时间: 2024-10-03 13:47:54

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

如何文档化你的PHP类

你已经阅读过关于:面向对象编程可以帮助你管理你的大型web项目,并且你已经开始使用PHP来进行面向对象编程了吗?如果你已经编写了几个类应用在网站上并且你是一个有条理的人的话,那么你应该已经编写了关于它们的一些文档.但是如果你是一个象我一样的不拘小节的人,你只是会在类的源代码中加一些注释而没有别的文档.没有文档就很难记住方法的名字和它们的使用方法(参数和含义).解决这种情况最典型的办法就是打开源代码文件,从成百上千的语句中查找. 类似Javadoc的文档 应该有一种好的方法----如果你曾经使用过

如何文档化你的PHP类(一)

如何文档化你的PHP类(一) 作者:stefano Locati 翻译:limodou   你已经阅读过关于:面向对象编程可以帮助你管理你的大型web项目,并且你已经开始使用PHP来进行面向对象编程了吗?如果你已经编写了几个类应用在网站上并且你是一个有条理的人的话,那么你应该已经编写了关于它们的一些文档.但是如果你是一个象我一样的不拘小节的人,你只是会在类的源代码中加一些注释而没有别的文档.没有文档就很难记住方法的名字和它们的使用方法(参数和含义).解决这种情况最典型的办法就是打开源代码文件,从

求医院制剂中心管理系统和配液管理系统的需求文档

问题描述 医院要搞信息化,做需求时想看看别人是怎样做的以拓宽思路. 解决方案 解决方案二:该回复于2009-08-11 09:13:56被版主删除解决方案三:有熟人的话,去医院看看他们的流程就熟悉了.解决方案四:现成的需求文档应该很难有机会弄到的,不过可以去了解下医院现在的流程

大侠们,请问如何制作一个文档管理工具,大体就是对文档进行分类,搜索。感谢!

问题描述 大侠们,请问如何制作一个文档管理工具,大体就是对文档进行分类,搜索.感谢!我是一个文字工作IT盲,但是想干点事.现在手上有公司几年的各种文档.都是WORD电子版的.有时要查找一些文档记录好难,要一个一个打开.可不可以制作一个工具或一个平台,搜索一下,就会出现.如我按年份搜,它就会出现搜索年份的1.*年*月**会议**内容2.*年*月**会议**内容等等,按会议名称搜,也会出现搜索会议的1.*年*月**会议**内容2.*年*月**会议**内容等等.请大侠请教,感激不尽.....对了,我不

请教.net生成word文档的方法!

问题描述 大家好,我现在做的项目是用户在提交各种比较复杂申请表,在页面上录入各项内容,然后需生成word文档,因为申请表的格式固定,我以前的做法是,一.首先在word中画好表格,在需插入内容的地方标上书签,做成模板放在服务器上,然后页面生成word时去调用这个模板,把对应的内容插入到书签中,再保存成一个新的word文档放在服务器上.这种方法的缺点是,由于内容很多,需要做很多书签,容易出错,而且由于有大文本,格式也不好控制.二.在页面上自己把表格设置好,设置成word一样的格式,然后用javasc

mfc单文档-VC++程序调试,出现winocc.cpp中的问题!!!

问题描述 VC++程序调试,出现winocc.cpp中的问题!!! 我自己编写了一个单文档的小程序,然后运行程序之后出现中断,进过调试寻找到是winocc.cpp中的void CWnd::GetProperty和void CWnd::SetProperty两个函数中的_ASSERT(m_pCtrlSite != NULL);均出现错误.希望大神能帮忙指出错误类型!!!谢谢!!! 这是出错部分代码!! float* try::fun1( )//创建指定区域 { GET dlg; dlg.DoMod

Android源码研究的准备工作 -- 下载android源码到Ubuntu上(亲自调试,不能过分迷信GOOGLE文档)

参考资料: http://source.android.com/source/downloading.html#initializing-a-repo-client http://blog.csdn.net/xjanker2/article/details/4497013 http://www.cnblogs.com/nikyxxx/archive/2011/11/11/2246076.html http://www.cnblogs.com/yayagepei/articles/2753253.

阅读 NodeJS 文档,我学到了这 19 件事情

本文讲的是阅读 NodeJS 文档,我学到了这 19 件事情, 我相信我对 Node 了若指掌.我这 3 年来写的网站都是用 Node 来开发的.但实际上,我从没有详细查看 Node 文档. 长期的订阅者应该知道,我正处在书写每一个接口(interface),属性(prop),方法(method),函数(function),数据类型(data type)等等关于 Web 开发的漫漫长途中,这样可以填补我的知识面的空缺.在完成了 HTML,DOM, WebApi, CSS, SVG 和 EcmaS

文档型漏洞攻击研究报告

本文讲的是文档型漏洞攻击研究报告, 研究背景 由于反病毒技术快速发展及免费安全软件在全球的高度普及,恶意程序的传播变得越来越困难.自2013年以来,中国一直是全球个人电脑恶意程序感染率最低的国家. 但是随着漏洞挖掘及利用技术越来越公开化,导致越来越多的黑客更加倾向于利用常见办公软件的文档漏洞进行恶意攻击,特别是在一些APT(Advanced Persistent Threat)攻击中,更是体现得淋漓尽致.针对特定目标投递含有恶意代码的文档,安全意识薄弱的用户只要打开文档就会中招. 对于漏洞文档(