Tensorflow: tf.nn.conv2d 实际在哪里执行?

我对Tensorflow中tf.nn.conv2d(...)的实现感到好奇。调用它只需运行tf.nn.conv2d(...)。然而,我试图深入了解它在哪里执行。代码如下(箭头指示它最终调用的函数):

tf.nn.conv2d(...) -> tf.nn_ops.conv2d(...) -> tf.gen_nn_ops.conv2d(...) -> _op_def_lib.apply_op("Conv2D", ...) -> ?

我熟悉Tensorflow对LSTM的实现以及根据需要轻松操纵它们的能力。执行conv2d()计算的函数是用Python编写的吗?如果是,它在哪里?我能看到步长是如何执行的吗?


回答:

TL;DR: tf.nn.conv2d()的实现是用C++编写的,它调用了使用Eigen(在CPU上)或cuDNN库(在GPU上)的优化代码。你可以在这里找到实现这里

你在问题中提到的函数链(从tf.nn.conv2d()开始向下)是用于构建TensorFlow图的Python函数,但这些函数并不调用实现。请记住,在TensorFlow中,你首先构建一个符号图,然后执行它

tf.nn.conv2d()的实现只有在你调用Session.run()并传递一个Tensor,其值依赖于某些卷积的结果时才会被执行。例如:

input = tf.placeholder(tf.float32)filter = tf.Variable(tf.truncated_normal([5, 5, 3, 32], stddev=0.1)conv = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')result = sess.run(conv, feed_dict={input: ...})  # <== 执行发生在这里。

调用sess.run(...)告诉TensorFlow运行所有需要计算conv值的操作,包括卷积本身。从这里到实现的路径有些复杂,但会经过以下步骤:

  1. sess.run()调用TensorFlow后端来获取conv的值。
  2. 后端修剪计算图以确定必须执行哪些节点,并将节点放置在适当的设备上(CPU或GPU)。
  3. 指示每个设备使用执行器执行其子图。
  4. 执行器最终调用对应于卷积运算符的tensorflow::OpKernel,通过调用其Compute()方法。

"Conv2D" OpKernel的实现在这里,其Compute()方法在这里。因为这个操作对许多工作负载来说是性能关键的,所以实现相当复杂,但基本思想是将计算卸载到Eigen Tensor库(如果在CPU上运行)或cuDNN的优化GPU实现上。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注