TensorFlow,为什么python是选择的语言?

时间:2016-02-28 01:40:08

标签: python c++ machine-learning tensorflow

我最近开始研究深度学习和其他ML技术,我开始寻找简化构建网络并训练它的过程的框架,然后我发现TensorFlow,在该领域的经验很少,对我来说,似乎如果使用深度学习,速度是制作大型ML系统的一个重要因素,那么为什么谷歌选择python制作TensorFlow?用一种可编译而不能解释的语言来制作它会不会更好?

使用Python而不是像C ++这样的语言进行机器学习有什么好处?

4 个答案:

答案 0 :(得分:201)

关于TensorFlow最重要的事情是,在大多数情况下,核心不是用Python编写的:它是用高度优化的C ++和CUDA(Nvidia的语言为编程GPU)。反过来,通过使用Eigen(高性能C ++和CUDA数值库)和NVidia's cuDNNNVidia GPUs的非常优化的DNN库)来实现大部分功能,例如{ {3}})。

TensorFlow的模型是程序员使用“某种语言”(很可能是Python!)来表达模型。此模型使用TensorFlow构造编写,例如:

h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
运行Python时,

实际上并未执行。相反,实际创建的是convolutions,它表示采取特定输入,应用特定操作,提供结果作为其他操作的输入,等等。 此模型由快速C ++代码执行,并且在大多数情况下,操作之间的数据永远不会复制回Python代码

然后程序员通过拉动节点来“驱动”这个模型的执行 - 通常用Python训练,服务,有时用Python,有时用原始C ++:

sess.run(eval_results)

这一个Python(或C ++函数调用)使用对C ++的进程内调用或分布式版本的dataflow graph来调用C ++ TensorFlow服务器以告诉它执行,然后复制回来结果

所以,话说回来,让我们重新说一句:为什么TensorFlow选择Python作为表达和控制模型训练的第一个支持良好的语言?

答案很简单:对于大量数据科学家和机器学习专家而言,Python可能是 最舒适的语言,它也易于集成并控制C ++后端,同时也是是一般的,在Google内外广泛使用,以及开源。鉴于使用TensorFlow的基本模型,Python的性能并不重要,它很自然。这也是一个巨大的优势,RPC可以很容易地在Python中进行预处理 - 同时具有高性能 - 然后将其输入TensorFlow以获得真正的CPU重量。

表达在执行时未使用的模型还有很多复杂性 - 形状推断(例如,如果你做matmul(A,B),结果数据的形状是什么?)和自动NumPy计算。事实证明,能够用Python表达这些内容真是太好了,不过从长远来看,他们可能会转向C ++后端,以便更容易地添加其他语言。

(当然希望在将来支持其他语言来创建和表达模型。使用其他几种语言进行推理已经非常简单了 - C ++现在可以使用,有人来自Facebook贡献gradient我们现在正在审查的绑定等。)

答案 1 :(得分:23)

TF不是用python编写的。它是用C ++编写的(使用高性能数字librariesCUDA代码),您可以通过查看github来查看。所以the core is written not in python但TF提供了许多其他语言的接口(python, C++, Java, Go

enter image description here

如果您来自数据分析领域,您可以将其视为numpy(不是用python编写,而是提供Python的接口),或者如果您是Web开发人员 - 将其视为数据库(PostgreSQL, MySQL,可以从Java,Python,PHP调用

由于many reasons,Python前端(人们在TF中编写模型的语言)最受欢迎。在我看来,主要原因是历史:大多数ML用户已经使用它(另一个流行的选择是R)所以如果你不提供python的接口,你的库很可能注定要默默无闻。

但是用python编写并不意味着你的模型是在python中执行的。相反,如果你以正确的方式编写模型,那么在评估TF图时,Python永远不会被执行(tf.py_func()除外,它存在于调试中,应该在实际模型中完全避免,因为它是在Python的一面)。

这与例如numpy不同。例如,如果你执行np.linalg.eig(np.matmul(A, np.transpose(A))eig(AA')),操作将以某种快速语言(C ++或fortran)计算转置,将其返回到python,将它与A一起从A获取,并计算在一些快速语言中的乘法并将其返回到python,然后计算特征值并将其返回到python。因此,像matmul和eig这样昂贵的操作是有效计算的,你仍然会通过将结果移动到python并强制来减少时间。 TF不会这样做,一旦你定义了图形,你的张量不是在python中流动,而是在C ++ / CUDA /其他东西中。

答案 2 :(得分:3)

Python允许您使用C和C ++创建扩展模块,与本机代码连接,并且仍然可以获得Python为您提供的优势。

TensorFlow使用Python,是的,但它也包含大量的C++

这允许一个更简单的实验接口,使用Python可以减少人为的开销,并通过编写C ++中最重要的部分来增加性能。

答案 3 :(得分:0)

您可以从here查看的最新比率显示,TensorFlow C ++内部占用了约50%的代码,而Python占用了约40%的代码。

C ++和Python都是Google的官方语言,所以也难怪为什么会这样。如果我必须在存在C ++和Python的地方提供快速回归...

C ++位于计算代数内部,Python用于包括测试在内的所有其他功能。知道今天的测试无处不在,所以难怪Python代码对TF做出了如此大的贡献。