Oll*_*egn 131 c++ python machine-learning tensorflow
我最近开始研究深度学习和其他ML技术,我开始寻找简化构建网络和训练它的过程的框架,然后我发现TensorFlow,在该领域经验不多,对我来说,似乎速度是一个如果使用深度学习,那么制作大型ML系统的重要因素就更多了,那么为什么谷歌选择python制作TensorFlow?用一种可以编译而不是解释的语言来表达它会不会更好?
使用Python而不是像C++这样的语言进行机器学习有什么好处?
dga*_*dga 218
关于TensorFlow最重要的事情是,在大多数情况下,核心不是用Python编写的:它是用高度优化的C++和CUDA(Nvidia用于编程GPU的语言)的组合编写的.反过来,大部分都是通过使用Eigen(高性能C++和CUDA数值库)和NVidia的cuDNN(用于NVidia GPU的非常优化的DNN库,用于卷积等功能)来实现的.
TensorFlow的模型是程序员使用"某种语言"(很可能是Python!)来表达模型.这个模型,用TensorFlow结构编写,如:
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
Run Code Online (Sandbox Code Playgroud)
在运行Python时实际上并未执行.相反,实际创建的是一个数据流图,它表示采用特定输入,应用特定操作,提供结果作为其他操作的输入,等等. 此模型由快速C++代码执行,并且在大多数情况下,操作之间的数据永远不会复制回Python代码.
然后程序员通过拉动节点来"驱动"这个模型的执行 - 通常用Python训练,服务,有时用Python,有时用原始C++:
sess.run(eval_results)
Run Code Online (Sandbox Code Playgroud)
这一个Python(或C++函数调用)使用对C++的进程内调用或分布式版本的RPC调用C++ TensorFlow服务器来告诉它执行,然后复制结果.
所以,话说回来,让我们重新说一下这个问题:为什么TensorFlow选择Python作为表达和控制模型训练的第一个支持良好的语言?
答案很简单:对于大量数据科学家和机器学习专家而言,Python可能是最舒适的语言,它也易于集成并控制C++后端,同时也是一般的,在内部和外部广泛使用谷歌和开源.鉴于使用TensorFlow的基本模型,Python的性能并不重要,它很自然.这也是一个巨大的优势,NumPy可以很容易地在Python中进行预处理 - 同时具有高性能 - 然后将其输入TensorFlow以获得真正的CPU重量.
表达在执行时不使用的模型还有很多复杂性 - 形状推理(例如,如果你做matmul(A,B),结果数据的形状是什么?)和自动梯度计算.事实证明,能够在Python中表达这些内容一直很好,但我认为从长远来看,他们可能会转向C++后端,以便更容易地添加其他语言.
(当然,希望是在未来支持其他语言来创建和表达模型.使用其他几种语言进行推理已经非常简单了 - C++现在可以使用,来自Facebook的人提供了我们正在审查的Go绑定等)
Sal*_*ali 26
TF不是用python编写的.它是用C++编写的(并使用高性能数值库和CUDA代码),你可以通过查看它们的github来检查它.所以核心不是用python编写的,而TF提供了许多其他语言的接口(python,C++,Java,Go)
如果您来自数据分析世界,您可以将其视为numpy(不是用python编写,而是提供Python的接口),或者如果您是Web开发人员 - 将其视为数据库(PostgreSQL,MySQL,可以从Java,Python,PHP调用)
由于许多 原因, 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一起从python中获取,并以某种快速语言计算乘法并将其返回到python,然后计算特征值并将其返回到python.因此,像matmul和eig这样昂贵的操作是有效计算的,你仍然会通过将结果移动到python并强制执行而浪费时间.TF不会这样做,一旦你定义了图形,你的张量不是在python中,而是在C++/CUDA /其他东西中.
| 归档时间: |
|
| 查看次数: |
54297 次 |
| 最近记录: |