我最近开始研究深度学习和其他机器学习技术,我开始寻找能够简化网络构建和训练过程的框架,然后我发现 TensorFlow,在这个领域没有什么经验,对我来说,如果使用深度学习,速度似乎是制造大型机器学习系统的一个重要因素,那么为什么 Python 被谷歌选中制造 TensorFlow 呢?如果使用一种可编译而不能解释的语言,不是更好吗?
与 C + + 这样的机器学习语言相比,使用 Python 有哪些优势?
Python 允许您使用 C 和 C + + 创建扩展模块,与本机代码进行接口,并且仍然可以获得 Python 提供的优势。
TensorFlow 使用 Python,是的,但是它也包含大量的 C + + 。
这允许使用一个更简单的接口进行实验,减少 Python 的人工思维开销,并通过在 C + + 中编写最重要的部分来增加性能。
实现 TensorFlow 最重要的一点是,在大多数情况下,内核不是用 Python 编写的: 它是用高度优化的 C + + 和 CUDA (Nvidia 用于编写 GPU 的语言)的组合编写的。反过来,通过使用 Eigen(一个高性能 C + + 和 CUDA 数字库)和 NVidia 的 cudnN(一个非常优化的用于 NVidia 图形处理器的 DNN 库,用于诸如 卷积之类的函数) ,大部分情况都会发生。
TensorFlow 的模型是程序员使用“某种语言”(很可能是 Python!)来表达模型。这个模型是在 TensorFlow 构造中编写的,例如:
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1) h2 = ...
在运行 Python 时并没有实际执行。相反,实际上创建的是一个 数据流图数据流图,它表示接受特定的输入,应用特定的操作,将结果作为输入提供给其他操作,等等。这个模型由快速的 C + + 代码执行,并且在大多数情况下,操作之间的数据不会被复制回 Python 代码.
然后程序员通过拉动节点来“驱动”这个模型的执行——为了培训,通常是在 Python 中,为了服务,有时是在 Python 中,有时是在原始的 C + + 中:
sess.run(eval_results)
这个 Python (或者 C + + 函数调用)使用对 C + + 的进程内调用或者对分布式版本的 RPC来调用 C + + TensorFlow 服务器,告诉它执行,然后复制回结果。
那么,既然如此,让我们重新表述这个问题: 为什么 TensorFlow 选择 Python 作为第一个支持良好的用于表达和控制模型训练的语言?
答案很简单: Python 对于大量的数据科学家和机器学习专家来说可能是 的最舒适的语言,它也很容易集成和控制 C + + 后端,同时也是通用的,在 Google 内部和外部都被广泛使用,并且是开源的。考虑到 TensorFlow 的基本模型,Python 的性能并不那么重要,这是一种自然的适应。这也是一个巨大的优点,因为 笨蛋使用 Python 进行预处理变得非常容易——也具有很高的性能——然后再将其提供给 TensorFlow 处理真正的 CPU 负荷过重的事情。
在表达模型时也有很多复杂性,在执行模型时没有使用——形状推断(例如,如果执行 matmul (A,B) ,结果数据的形状是什么?)和自动 渐变计算。尽管我认为从长远来看,它们可能会转移到 C + + 后端,从而使得添加其他语言变得更加容易,但是能够用 Python 来表达这些语言还是很不错的。
(当然,我们希望将来能够支持其他语言来创建和表达模型。使用其他几种语言运行推理已经非常简单了—— C + + 现在可以工作了,Facebook 上有人提供了我们正在审查的 去吧绑定,等等。)
TF 不是用 Python 编写的。它是用 C + + 编写的(并且使用高性能的数字 图书馆和 CUDA代码) ,您可以通过查看它们的 Github来检查这一点。因此,内核不是用 python 写的但 TF 为许多其他语言(Python,C + + ,Java,Go)提供了一个接口
如果你来自一个数据分析的世界,你可以把它想象成 numpy (不是用 Python 编写的,而是提供了一个 Python 接口) ,或者如果你是一个 web 开发者——把它想象成一个数据库(PostgreSQL,MySQL,可以从 Java,Python,PHP 调用)
由于 很多 原因,Python 前端(人们用 TF 编写模型的语言)是最流行的。在我看来,主要的原因是历史: 大多数机器学习用户已经使用它(另一个流行的选择是 R) ,所以如果你不提供一个接口到 python,你的库很可能是注定要默默无闻。
但是用 python 编写并不意味着模型在 python 中执行。相反,如果您以正确的方式编写模型,则在 TF 图的求值过程中永远不会执行 Python (除了 Py _ func (),它存在于调试中,在实际模型中应该避免执行,因为它是在 Python 这边执行的)。
这与例如 numpy 不同。例如,如果你使用 np.linalg.eig(np.matmul(A, np.transpose(A))(即 eig(AA')) ,这个操作将用某种快速语言(C + + 或 fortran)计算转置,将其返回给 python,将它与 A 一起从 python 获取,然后用某种快速语言计算乘法,并将其返回给 python,然后计算特征值并将其返回给 python。因此,尽管如此,像 matmul 和 eig 这样昂贵的操作可以有效地计算,但是将结果移回 python 并强制执行仍然会浪费时间。TF 不这样做,一旦你定义了这个图,你的张量流不是在 python 中,而是在 C + +/CUDA/其他程序中。
np.linalg.eig(np.matmul(A, np.transpose(A))
eig(AA')
您可以从 给你中检查的最新比率显示,TensorFlow C + + 占用了约50% 的代码,Python 占用了约40% 的代码。
C + + 和 Python 都是 Google 的官方语言,所以这也就不足为奇了。如果我必须提供 C + + 和 Python 存在的快速回归..。
C + + 在计算代数中,Python 用于其他任何事情,包括测试。知道了今天测试是多么的普遍,就不难理解为什么 Python 代码对 TF 贡献了那么多。