如何评价奚梦瑶 知乎TensorFlow 1.0

观点 | TensorFlow sucks,有人吐槽TensorFlow晦涩难用_凤凰科技
观点 | TensorFlow sucks,有人吐槽TensorFlow晦涩难用
用微信扫描二维码分享至好友和朋友圈
原标题:观点 | TensorFlow sucks,有人吐槽TensorFlow晦涩难用 选自nic
原标题:观点 | TensorFlow sucks,有人吐槽TensorFlow晦涩难用
选自nicodjimenez
机器之心编译
参与:李泽南、刘晓坤
作为当今最流行的深度学习框架,TensorFlow 已经出现了两年之久。尽管其背后有着谷歌这样的科技巨头支持,但它的很多缺点已经开始显现。本文作者,创业公司 Mathpix 的首席执行官 Nicolas D. Jimenez 试图向我们全面分析 TensorFlow 的缺点。
每隔几月,我都会向谷歌的搜索框里键入「TensorFlow sucks」或「f**k TensorFlow」,期待能在互联网上找到和我志同道合的人。不幸的是,尽管 TensorFlow 已经出现了两年之久,我们还是很难找到一篇能够全面「冷静评价」TensoFlow 的文章。
或许这是因为我用了一个错误的搜索引擎?应该不是这样,我认为原因在于谷歌信仰。全球的工程师们或多或少都有一点对于谷歌的盲目崇拜,表现在于认为:
在谷歌工作的人比自己更聪明
如果用好 TensorFlow,或许能在谷歌找到一个深度学习的工作(继续做梦吧少年)
如果你的创业公司使用的深度学习框架是 TensorFlow,而你的博客宣扬了它的优点,谷歌或许会考虑来收购你
如果你 get 不到 TensorFlow 的优点,那你就是不懂事
但我们还是要客观,让我们抛弃以上假设,还原 TensorFlow 的真面目吧。
当 TensorFlow 刚刚出现时,它的开发者们承诺将会结束深度学习框架缺乏维护的阴暗时代(看看 https://github.com/BVLC/caffe/issues 吧)我们或许会得到一个像 Java 一样的深度学习框架(写出来就可以在任何地方使用),虽然不怎么有趣,但有一个纯粹的陈述范式。然而,事情好像并没有这么顺利。
究竟哪里出错了?为了构建一个能让所有人都满意的产品,谷歌似乎只做到了在所有方面都一般般的结果。
对于研究人员来说,TensorFlow 难以学习和使用。研究只关乎灵活性,而缺乏灵活性正是根植于 TensorFlow 的特性之一。
想要提取神经网络中间层的数值?你需要定义一个图,然后以字典的形式传递数据,同时不要忘了在图的中间层添加输出,否则你将无法获得它的值。虽然这很麻烦,但还是可行的。
想要有条件地执行几个层?比如让 RNN 在句子末端(EOS)生成表征时停止?到你学会使用 PyTorch 做这件事的时候,你可能已经身处第三家摇摇欲坠的创业公司了。对于像我这样的机器学习从业者而言,TensorFlow 也并不是一个绝佳的选择。框架的声明特性使调试变得更加困难。能够让模型运行在安卓和 iOS 上的能力看起来很美好,但当你看到框架二进制文件的大小(20Mb 以上)后就不那么想了。或许你会尝试寻找那几乎不存在的 C++说明文档,或者尝试加入任何类型的条件网络执行——它们在移动端这种计算资源缺乏的情况下比较好用。 对比其它的框架
确实 TensorFlow 的开发者都是深度学习的超级巨星。然而,最为出名且受人尊敬的 TensorFlow 的最初开发者贾扬清,离开了谷歌而加入了 Facebook,在那里他的 Caffe2 项目正在快速推进。和 TensorFlow 不一样,Caffe2 允许用户只用一行代码就能为数据创建一个层,非常激进的革新!
此外,Pytorch 在顶级的 AI 研究者中推广的很迅速。虽然 Torch 用户需要编写 Lua 代码执行简单的字符串运算以防止 RSI 损伤,不过并没有完全抛弃 TensorFlow,只是转换成了 PyTorch。看来 TensorFlow 对于顶级的 AI 实验室来说只是不够好而已。抱歉了,谷歌。
我最感兴趣的是为什么谷歌会在 TensorFlow 中选择完全陈述范式而不顾这种方法的明显弊端。他们是不是觉得把所有的计算压缩进单一的计算图会简化在 TPU 上执行模型,从而可以省下英伟达提供的云端驱动深度学习芯片的几百万美元的费用吗?很难说。总之,对公众来说,TensorFlow 并不像是一个完全开源的项目,我很同意。虽然设计精巧,但比起谷歌那些漂亮的的开源项目如 Protobuf,Golang 和 Kubernetes,TensorFlow 实在差的太远。
虽然陈述范式对于 UI 编程很有用,但是对于深度学习而言,这个选择造成了困难,有这么几个原因。
以 React Javascript 库为例,这是今天交互网页应用的标准选择。在 React 中,数据在应用中流通的复杂过程对开发者来说是不可见的,这很合理,因为 JavaScript 的执行通常比 DOM 的更新快得多。只要终端用户体验足够好,React 的开发者并不关心状态传播的机制。
另一方面,在深度学习中,一个层就需要用到几百万 FLOP。而且深度学习研究者都很关心计算过程的机制,并希望能很好的控制过程,因为他们随时都在扩大可能性的边缘(比如动态网络),并希望能很容易获取中间结果。 一个实例
我们看看这个简单的例子,通过训练模型使其将输入乘以 3。
首先看看 TensorFlow 的例子:
import tensorflow as tf
import numpy as np
X = tf.placeholder("float")
Y = tf.placeholder("float")
W = tf.Variable(np.random.random(), name="weight")
pred = tf.multiply(X, W)
cost = tf.reduce_sum(tf.pow(pred-Y, 2))
optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for t in range(10000):
x = np.array(np.random.random()).reshape((1, 1, 1, 1))
(_, c) = sess.run([optimizer, cost], feed_dict={X: x, Y: y})
接下来看看 Pytorch 的例子:
import numpy as np
import torch
from torch.autograd import Variable
model = torch.nn.Linear(1, 1)
loss_fn = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for t in range(10000):
x = Variable(torch.from_numpy(np.random.random((1,1)).astype(np.float32)))
y_pred = model(x)
loss = loss_fn(y_pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print loss.data[0]
虽然 PyTorch 的例子比 TensorFlow 少一行代码,但其中的计算过程要更加清晰易懂,训练循环中的句法和真实的学习过程要匹配得多:
1. 输入的前向传递
2. 生成损失
3. 计算梯度
4. 反向传播
而在 TensorFlow 中核心的算子是像魔术一般呼叫 sess.run。
你真的想写更多行,但是又很难理解和维护的代码吗?PyTorch 的接口从客观上讲比 TensorFlow 要好得多。 结论
通过 TensorFlow,谷歌成功创造了一个完整的深度学习框架,但它同时也太过难以使用,过于低级,不适用于快速进行原型设计;对于尖端研究和资源驱动的生产环境来说又过于高级。
老实说,当你意识到已经有六个开源的高级库是建立在已经是高级库的 TensorFlow 的基础上——才能让一切变得可用起来——这里面的问题就不是一星半点了:
http://tflearn.org/
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/slim
https://github.com/fchollet/keras
https://github.com/tensorflow/skflow
注意:我得承认 Tensorboard(TensorFlow 的监视工具)非常棒。但如果你你想找到一个完美的机器学习项目监控解决方案,其中包含深度模型对比特征,你可以试试 Losswise(https://losswise.com/)。我开发它就是为了让我这样的人能够轻松解耦并追踪使用所有库的模型的表现,我也实现了 Tensorboard 不能提供的很多有用特性。
用微信扫描二维码分享至好友和朋友圈
凤凰科技官方微信
播放数:129291
播放数:5808920
播放数:115279
播放数:5808920219被浏览9,866分享邀请回答mp.weixin.qq.com/s/3p7YI6kD2fZZtp5lFVmx1w感慨的话就是0.12到1.0,第一个数字变了说明是个重大更新,以前写的很多程序估计会有bug报错了,心疼。第二个感慨以后学术也好工作也好keras都要好好学一下了。133 条评论分享收藏感谢收起2添加评论分享收藏感谢收起如何评价TensorFlow 1.0_百度知道
如何评价TensorFlow 1.0
我有更好的答案
Google开发的人工智能系统尽管不是市面上唯一的开发框架,但Google的开发能力是强大的,如同之前的Android系统、Map Reduce技术一样,其强大的影响力可以引领一个领域的发展。
采纳率:93%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。摘要:本文主要对tf的一些常用概念与方法进行描述。
主要是常用的api有一定的更改:
tf.mul、tf.sub 和 tf.neg 被弃用,现在使用的是 tf.multiply、tf.subtract 和 tf.negative.
新的版本中这些方法...
TensorFlow1.2.0版主要变化
TensorFlow 1.0 重大功能及改善
XLA(实验版):初始版本的XLA,针对TensorFlow图(graph)的专用编译器,面向CPU和GPU。
TensorFlow Debu...
TensorFlow 1.0 新增功能及改善
XLA(实验版):初始版本的XLA,针对TensorFlow图(graph)的专用编译器,面向CPU和GPU。
TensorFlow Debugger...
Docker版本的1.12,仔细看来确实有了不少的变化,作为一个小版本号的升级能有如此之多的功能更新可能确实会让不少追随者喜出望外。1.12就能如此了,让人不由得好奇docker到2.0的时候是要有多...
来源:开源中国社区www.oschina.net/news/90807/overview-of-visual-studio-2017-updates-for-net-developersVisual ...
内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点。该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式。数据存在内存中的好处显而易见,而列...
甲骨文为了提前释出Java新版,将部分重大功能延后到第8版,也如期在7月底释出Java SE 7,不过企业版Java EE 7则要等到2012年才会释出。
甲骨文如期在7月28日释出Java S...
IntelliJ IDEA v2017.1到来!功能大量更新!本次更新图文较多,部分功能详细内容请点击文章末尾链接详细查看!
【点击下载最新版IntelliJ IDEA v2017.1】
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)5,543被浏览289,216分享邀请回答http://cloc.sourceforge.net v 1.64
T=45.33 s (68.5 files/s, 14956.6 lines/s)
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
C/C++ Header
TypeScript
Bourne Shell
NAnt script
Protocol Buffers
Objective C++
Bourne Again Shell
Javascript
Objective C
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
对于想要学习TensorFlow(以下简称TF)的人,根据目的不同,可以简单分为以下2类:1. 研究学者,仅仅需要TF这个平台实现深度学习算法,无需了解太多底层原理2. 好学的行业内人员(比如我⊙﹏⊙),不仅需要了解算法模型,同时还要熟悉TF平台的原理。在算子、通信、模型优化等方面进行平台的二次开发的人。研究学者:
你们可以考虑使用Keras,python写的深度神经网络库,已经实现了绝大部分神经网络,如:RNN、GRU、LSTM,CNN,Pooling,Full-Connected,以及sigmoid、tanh、Relu、PRelu、SRelu等各种激活函数。并且采用TF/Theano作为后端计算引擎,自己本身拥有一套更高层的API,可以同时跑在TF/Theano平台上。
相对于TF来说,这个学习压力小了很多,我们公司负责算法的同事也是用Keras来写模型,然后我再用TF的API来实现分布式部署。附:开发人员:
对于我们这类人来说,首先需要弄清平台的很多名称、概念、定义,
曾说过TF有太多的Abstraction需要学习。诚然,这加大了我们的学习难度。但是,这也说明Google是想要把这个平台做大做强的,所以才会花时间去设计这一套框架和统一的结构。特别是读了部分源码后,更有这种感触。
那么,具体要怎么开始呢?
极客学院有翻译部分TF的官方文档,对于初步了解Tensor、DAG、Operator、Variable、Device、Optimizer等是帮助的。在看完这些概念后,有一个MNIST的例子程序作为TF的入门。这个样例用一个简单的Softmax实现了手写体数字识别的神经网络,只有一层参数。同时还介绍了Session、tf.placeholder、图的计算等重要概念。
在看完这个样例后,如果理解了DAG和Session,可以继续看用卷积神经网络实现的MNIST,准确率上升到了99%,相对于单层Softmax的92%左右,已经接近目前最高的准确率了。附:
TF v0.8发布了分布式模型,我也研究了将近1个月,才把Seq2seq机器翻译改造成了分布式,但是现在公司不让发布出来ORZ。好消息是,我改写了社区的MNIST分布式程序,并且已经合并到master分支了。所以,如果想要继续学习分布式的话,我建议可以看一下那份代码。比较遗憾的是,极客学院目前没有翻译分布式的教程,所以大家得移步TF官网(貌似被墙了)。
由于分布式的资料较少,我这里简单梳理下概念,大家在官网会看到他们的定义:
TF采用了PS/Worker的结构来定义集群,其中
PS(parameter server):存储variable(模型参数),主要负责参数更新和发放;
Worker:存储operator,主要负责图计算和梯度计算(TF使用Optimizer实现了自动化的梯度计算);
job:由于工作类型不同,用job_name来区分ps和worker
task:对于每个worker来说,具体做什么任务(算什么图)也有可能不同,用task_index区分
device:指具体的CPU/GPU,通常PS绑定到CPU上,Worker绑定到GPU上,各取所长。
syncReplicaOptimizer:同步优化器,其本质仍然是用普通优化器进行梯度计算,但是通过Queue机制和Coordinator多线程协同实现了所有worker的梯度汇总和平均,最终将梯度传回PS进行参数更新。
以上几个概念对于分布式的理解非常重要。当然,想要完全弄懂,还得不断的看文档和源码。源码我推荐几个python目录下非常值得看的基础类定义:
framework/Ops.py:定义了Tensor、Graph、Opreator类等
Ops/Variables.py:定义了Variable类附:最后,欢迎大家Follow我的Github账号:84855 条评论分享收藏感谢收起colah.github.io/, 这几个都是我在学习中遇到的非常nice的blog,有时间读读定会有所收获。8.经典论文及书籍:收集了一些DL的经典论文&书籍,有些杂乱,不过几乎都是经典,各取所需吧。百度云地址:(已删除,内容上有些陈旧了,并且百度云总是封杀链接)。各位有更好的欢迎推荐,我会整理上传。9.几篇原创TF相关文章(持续更新):,,,其中,Python,DL,Tensorflow是重点,其他都是辅助, 自己感觉够用即可,无需深入。学习中遇到困难首先向搜索引擎询问。 更新:更新部分链接以及资源描述 更新:添加了一些推荐资源,序号重新排版,在首部重点推荐了几个教程,方便快速上手 更新:修正一些排版问题,删除百度云链接,增加CS 20SI课程 更新:更新失效的百度云地址 更新:修正笔误,同时加了前言 更新:修正一些笔误 更新:完成了近期更新计划,重新整理了所有内容,同时及时跟进了新的内容 更新:更新了在移动端使用TF的项目笔记,添加了近期更新计划 更新:更新预告 更新:更新了提及的软件版本号,添加了第九部分原创TF相关博文 更新:更新了提及的软件版本号 更新:重新排版,上传了资料 更新:重新排版66448 条评论分享收藏感谢收起

我要回帖

更多关于 刘德凯如何评价刘雪华 的文章

 

随机推荐