我对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: ...}) # <== Execution happens here.
调用sess.run(...)
告诉TensorFlow运行所有需要计算的值的运算conv
,包括卷积本身。从这里到实现的路径有些复杂,但是需要执行以下步骤:
sess.run()
调用TensorFlow后端以获取的值conv
。tensorflow::OpKernel
通过调用卷积运算符的Compute()
方法来调用对应于卷积运算符的。该"Conv2D"
OpKernel实现这里,其Compute()
方法是在这里。由于此操作对于许多工作负载而言对性能至关重要,因此实现起来相当复杂,但是基本思想是将计算分流到Eigen Tensor库(如果在CPU上运行)或cuDNN的优化GPU实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句