掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

TensorFlow sucks,有人吐槽TensorFlow晦涩难用

本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载。

每隔几月,我都会向谷歌的搜索框里键入「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 的例子:

  1. import tensorflow as tf

  2. import numpy as np

  3. X = tf.placeholder("float")

  4. Y = tf.placeholder("float")

  5. W = tf.Variable(np.random.random(), name="weight")

  6. pred = tf.multiply(X, W)

  7. cost = tf.reduce_sum(tf.pow(pred-Y, 2))

  8. optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(cost)

  9. init = tf.global_variables_initializer()

  10. with tf.Session() as sess:

  11.    sess.run(init)

  12.    for t in range(10000):

  13.        x = np.array(np.random.random()).reshape((1, 1, 1, 1))

  14.        y = x * 3

  15.        (_, c) = sess.run([optimizer, cost], feed_dict={X: x, Y: y})

  16.        print c

接下来看看 Pytorch 的例子:

  1. import numpy as np

  2. import torch

  3. from torch.autograd import Variable

  4. model = torch.nn.Linear(1, 1)

  5. loss_fn = torch.nn.MSELoss声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 个人/企业涉诉查询

    通过企业关键词查询企业涉松详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

    通过企业关键词查询企业涉松详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

  • 账号黑产风险识别

    根据手机号来查询是否命中黑产风险

    根据手机号来查询是否命中黑产风险

  • IP反查域名

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

  • 人脸卫士

    结合权威身份认证的精准人脸风险查询服务,提升人脸应用及身份认证生态的安全性。人脸风险情报库,覆盖范围广、准确性高,数据权威可靠。

    结合权威身份认证的精准人脸风险查询服务,提升人脸应用及身份认证生态的安全性。人脸风险情报库,覆盖范围广、准确性高,数据权威可靠。

  • 全国城市空气质量

    全国城市和站点空气质量查询,污染物浓度及空气质量分指数、空气质量指数、首要污染物及空气质量级别、健康指引及建议采取的措施等。

    全国城市和站点空气质量查询,污染物浓度及空气质量分指数、空气质量指数、首要污染物及空气质量级别、健康指引及建议采取的措施等。

0512-88869195
数 据 驱 动 未 来
Data Drives The Future