讲道理,我觉得TensorFlow太逊了

简介:
本文来自AI新媒体量子位(QbitAI)

本文作者Nico Jimenez。自2015年从斯坦福辍学后,他创造了图像处理API Mathpix,每月为全球数百万用户处理近2000万张图像。此外,他还创造了Mathpix内部机器学习监测和分析方案Losswise。目前,Losswise公开可用。

这篇文章译自Nico的博客,原文标题为《Tensorflow sucks》。在这篇文章中,作者详细论述了“为什么我觉得TensorFlow很逊”这个有趣问题。

本文为作者观点,不代表量子位立场。

 Nico Jimenez

每隔几个月,我都会在谷歌上搜索关键词“TensorFlow太逊了”或者“f* TensorFlow”,希望能找到观点一致的伙伴。这可没那么幸运,虽然TensorFlow已经开源两年了,但始终没有找到让我满意的怒怼。

这就有点不太科学了。从本质上看,赞扬TensorFlow的力量可被分为几波,但都可以被归因为“谷歌深深的嫉妒”现象。这个现象由世界各地的工程师们假设得出:

  • 谷歌员工可能比你更聪明,能力更高
  • TensorFlow用的6更容易在谷歌找到深度学习相关工作!
  • 平凡无奇的创业公司用了TonsorFlow并在博客上赞美它,可能更容易被谷歌收购
  • 如果你没用TensorFlow得到你想要的直观设计,那就是你自己的问题了

现在,我们将这些假设抛掉,客观地评判一下TensorFlow。

结束噩梦?

TensorFlow出现时,我们一度认为它能结束烂设计和深度学习框架的噩梦。但我们实际得到的,是一个和Java差不多的深度学习框架,它比Java少了一些趣味性,并且是纯声明性的开发方式。但这款产品的反馈出奇地好,看起来像谷歌做了一个满足所有人的框架,到底哪里不对?

对研究人员来说,TensorFlow有些难学和难用。灵活性在研究中至关重要,但在TensorFlow中缺乏灵活性是个深层次的问题。

举个例子,想从神经网络的中间层中提取相应值?首先,你需要定义一个函数图像,之后将其作为dictionary执行,当然不要忘记将中间层作为图像的输出,否则你无法检索到它们的值。

想要有条件地执行卷积层?比如当生成一个EOS token时,RNN会停止运行。在你完成这个任务的时候,其他人已经用Pytorch创立第3个AI公司了。

对于像我这样的机器学习实践者来说,TensorFlow也不是一个很好的选择,框架的声明性特性使调试更加困难。能在Android和iOS上运行模型看起来很棒,直到你发现这个框架的二进制文件至少20MB,C++文档几乎不存在,资源少时原本很管用的条件网络也无法执行。

与其他框架的对比

无法否认TensorFlow的开发人员一定是个天才,但目前TensorFlow的原作者中可能最出名的一个:贾扬清,已经离开谷歌加入Facebook了,并且加速开发了Caffe2框架。和TensorFlow不一样,Caffe2允许用户在一行代码中执行一层数据,这一点让人兴奋。

此外,Pytorch在顶尖AI研究者中迅速普及。尽管Torch用户因编写Lua代码执行简单字符串受挫,但他们并没有使用TensorFlow,转而使用了Pytorch。看来,对于顶级人工智能实验室来说,TensorFlow是不够的。

对我来说,最有趣的问题是为什么纯声明式开发方式有明显缺陷,谷歌还是要选择它。他们是否认为将所有计算都封装在一个计算图中,可以简化TPU的执行模型,这样他们就能从云端深度学习应用程序中节省数百万美元的英伟达芯片费用?很难说。

总的来说,TensorFlow并不像一个纯粹的开源项目。如果他们的设计合理,我将不会有任何问题。与谷歌开源的其他项目(如Protobuf、Golang和Kubernetes)相比,TensorFlow的使用人群并不活跃。

虽然声明式开发方式对于UI编程很有益,但对于深度学习来说,做出这个选择的原因有很多。

以标准的交互式Web应用程序React Javascript库为例,在React中,数据流通过应用程序的复杂性有助于隐藏开发人员,因为Javascript的执行顺序通常比更新DOM快得多。React开发人员不想担心传播状态,只要最终用户体验足够好就可以了。

另一方面,在深度学习中,单层网络可以执行数十亿的FLOP!深度学习研究人员非常关心计算机制,并希望进行精细地控制,因为它们不断地推动可能的边缘(例如动态网络),并希望轻松访问中间结果。

具体示例

不如看一个简单的例子,训练一个模型,将其输入乘以3。

首先,让我们看一下TensorFlow的示例:

再来看看在Pytorch上如何执行同样的任务:

尽管Pytorch的例子中只有几行代码,但执行结果却更精确,并且训练循环中的语法更遵循实际的学习进程:

  1. 前向输入
  2. 产生的损失
  3. 计算梯度
  4. 反向传播

而在TensorFlow中,核心操作是sess.run访问。

所以,我们为什么要编写更多行、更难于理解和维护的代码呢?Pytorch的界面比TensorFlow的界面要好得多。

结论

对于快速开发原型来说,TensorFlow太低层了。在但在前沿研究或资源受限的生产环境中使用又看起来层次又太高。

事实上,当你有大约6个开源的高级库建立在级别已经很高的库上,如果想使你的库可用,有些地方就会出问题:

http://tflearn.org/

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/slim

https://github.com/fchollet/keras

https://github.com/fchollet/keras

https://github.com/tensorflow/skflow

最后,我承认TensorBoard(Tensorflow的监测工具)是个不错的选择。如果你想要一个漂亮的监测解决方案,你的机器学习项目包含高级的模型比较功能,可以到Losswise上看看(https://losswise.com)。这是我自己开发的,开发人员可以从使用的机器学习库中跟踪模型性能,这是TensorBoard不提供的。

本文作者:安妮
原文发布时间:2017-10-09
相关文章
|
存储 安全 编译器
【C++ 17 新功能 std::visit 】深入解析 C++17 中的 std::visit:从原理到实践
【C++ 17 新功能 std::visit 】深入解析 C++17 中的 std::visit:从原理到实践
1076 1
|
存储 数据可视化 数据管理
在ArcGIS Pro中使用栅格函数
在ArcGIS Pro中使用栅格函数
489 1
|
缓存 前端开发 JavaScript
高效开发现代 Web 应用:从前端到后端的最佳实践
在开发现代 Web 应用时,前端和后端技术的选择对项目的性能、可维护性和用户体验至关重要。本文将探讨如何通过现代工具和框架来优化前端和后端开发流程。我们将分析前端技术(如 React 和 Vue.js)与后端技术(如 Node.js 和 Django)的集成,并提供实际案例来展示如何实现高效开发。无论是对新手还是经验丰富的开发者,本指南都提供了宝贵的洞见和实用的技巧,以帮助提高开发效率并构建出色的 Web 应用。
|
Ubuntu 数据安全/隐私保护
Ubuntu22.04LTS环境部署实战
这篇文章提供了Ubuntu 22.04 LTS操作系统的详细安装步骤,包括选择语言、键盘布局、网络配置、软件源设置、磁盘分区、安装OpenSSH服务以及完成安装和首次登录系统的过程。
714 6
Ubuntu22.04LTS环境部署实战
|
Windows
微信消息实现自动推送--方式一 成功啦 进来学
微信消息实现自动推送--方式一 成功啦 进来学
1144 1
|
数据采集 数据可视化 数据挖掘
深入浅出:Python在数据分析中的应用实践
本文旨在探讨Python语言在数据分析领域的高效应用,通过简洁的语法和强大的库支持,Python已成为数据科学家和分析师的首选工具。文章首先介绍了Python在数据处理、清洗、分析及可视化方面的基础知识,随后通过一个实际案例,展示了如何利用Pandas、NumPy、Matplotlib等库进行数据分析的完整流程。通过本文,读者将能够理解Python在数据分析中的核心价值,掌握其基本操作方法,并能够在实际项目中灵活运用。
|
存储 算法 安全
【集合系列】- 初探java集合框架图(一)
实际开发中,经常用到java的集合框架,比如ArrayList、LinkedList、HashMap、LinkedHashMap,几乎经常接触到,虽然用的多,但是对集合的整体框架,基础知识还是不够系统,今天想和大家一起来梳理一下!
1945 0
【集合系列】- 初探java集合框架图(一)
|
开发框架 小程序 JavaScript
微信小程序与vue区别
微信小程序与vue区别
|
数据采集 人工智能 算法
2022年计算机保研夏令营经验总结,11所院校经历,预推免上岸北大
2022年计算机保研夏令营经验总结,11所院校经历,预推免上岸北大
|
存储 缓存 Rust
Rust 笔记:Rust 语言中哈希结构(哈希映射,HashMap)、集合(哈希集,HashSet)及其使用
Rust 笔记:Rust 语言中哈希结构(哈希映射,HashMap)、集合(哈希集,HashSet)及其使用
1419 0