TensorFlow,为什么Python是select的语言?

我最近开始学习深度学习和其他ML技术,我开始寻找简化构buildnetworking和训练过程的框架,然后我发现TensorFlow,对于我来说在这个领域没有什么经验,似乎速度是一个为深入学习做出更大的ML系统的一个重要因素,那么为什么Pythonselectpython来制造TensorFlow呢? 把它翻译成一种可以被编译而不被解释的语言不是更好吗?

在C ++语言中使用Python进行机器学习有什么好处?

关于TensorFlow最重要的一点是, 核心不是用Python编写的 :它是用高度优化的C ++和CUDA(Nvidia用于编程GPU的语言)编写的。 其中大部分是通过使用Eigen (一种高性能C ++和CUDA数字图书馆)和NVidia的cuDNN (一种非常优化的用于NVidia GPU的 DNN库,用于卷积等function)发生的。

TensorFlow的模型是程序员使用“一些语言”(很可能是Python!)来expression模型。 这个模型写在TensorFlow中,如:

h1 = tf.nn.relu(tf.matmul(l1, W1) + b1) h2 = ... 

Python运行时实际上并没有执行。 相反,实际上创build的是一个数据stream图 ,它表示采取特定的input,应用特定的操作,将结果作为其他操作的input提供给等等。 这个模型是由快速的C ++代码执行的,大部分操作之间的数据不会被复制回Python代码

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

 sess.run(eval_results) 

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

所以,就这样说,让我们重新提出一个问题:为什么TensorFlowselectPython作为expression和控制模型训练的第一个得到良好支持的语言?

答案很简单:对于大量的数据科学家和机器学习专家来说,Python可能最舒适的语言,它也易于集成并控制C ++后端,同时也是普遍的,广泛用于内部和外部的谷歌和开源。 鉴于TensorFlow的基本模型,Python的性能并不那么重要,这是天作之合。 另外, NumPy可以很容易地在Python中进行预处理 – 同样具有很高的性能 – 在把它送到TensorFlow之前,真正的CPU是很重要的。

还有一堆复杂的expression模型,在执行时不用 – 形状推理(例如,如果你做了matmul(A,B),结果数据的形状是什么?)和自动梯度计算。 事实certificate,用Python来expression这些语言已经很不错了,不过我认为从长远来看,他们可能会转向C ++后端,以便更容易地添加其他语言。

(当然,希望在未来支持其他语言来创build和expression模型,使用其他几种语言进行推理已经非常简单了–C ++现在可以工作,Facebook上的某个人提供了我们现在正在审查的Go绑定等)

TF不是用python编写的。 它是用C ++编写的(并且使用高性能数值库和CUDA代码),你可以通过查看他们的github来查看。 所以核心不是写在Python中,但TF提供了许多其他语言( Python,C ++,Java,Go )的接口,

在这里输入图像说明

如果你来自一个数据分析领域,你可以把它看作是numpy(不是用python编写的,但是提供了Python的接口),或者你是一个web开发者 – 把它想象成一个数据库(PostgreSQL,MySQL,可以从Java,Python,PHP中调用)


Python前端(人们在TF中编写模型的语言)是最stream行的,原因很多 。 在我看来,主要原因是历史:大多数ML用户已经使用它(另一个stream行的select是R),所以如果你不会提供一个Python接口,你的图书馆很可能注定要默默无闻。


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

这与例如numpy不同。 例如,如果您执行np.linalg.eig(np.matmul(A, np.transpose(A)) (即eig(AA') ),该操作将以某种快速语言(C ++或fortran)计算转置,把它从python和A一起拿出来,然后用一些快速的语言来计算乘法,然后把它返回给python,然后计算特征值并把它返回给python,所以尽pipe像matmul和eig这样昂贵的操作是有效计算的,通过将结果移到python后面并强制执行TF不会这样做 ,一旦你定义了graphics,张量就不会stream入python,而是stream入C ++ / CUDA /其他东西。

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

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

这允许使用更简单的接口进行实验,减less用Python思考的开销,并通过编程C ++中最重要的部分来增加性能。