在tensorflow中查找gen_nn_ops的源代码

时间:2016-12-14 16:40:11

标签: python tensorflow deep-learning deconvolution

我是深度学习的tensorflow的新手,并且对tensorflow中的反卷积(卷积转置)操作感兴趣。我需要看看操作反卷积的源代码。我猜这个函数是conv2d_transpose() in nn_ops.py

但是,在函数中它调用另一个名为Implicit Flow的函数。我需要看看这个函数里面有什么,但我无法在存储库中找到它。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:36)

您无法找到此来源,因为来源是由bazel自动生成的。如果您从源代码构建,则会在bazel-genfiles中看到此文件。它也存在于您的本地发行版中,您可以使用inspect模块找到它。该文件包含自动生成的基础C ++实现的Python包装器,因此它基本上由一堆1行函数组成。查找此类生成的Python操作的基础C ++实现的快捷方式是将snake case转换为camel case,即conv2d_backprop_input - > Conv2dBackpropInput

# figure out where gen_nn_ops is
print(tf.nn.conv2d_transpose.__globals__['gen_nn_ops'])

from tensorflow.python.ops import gen_nn_ops
import inspect
inspect.getsourcefile('gen_nn_ops.conv2d_backprop_input')
'/Users/yaroslav/anaconda/lib/python3.5/site-packages/tensorflow/python/ops/gen_nn_ops.py'

如果你想知道这个文件是如何产生的,你可以跟踪BUILD文件中的bazel依赖关系。它找到从张量流源树生成它的Bazel目标:

fullname=$(bazel query tensorflow/python/ops/gen_nn_ops.py)
bazel query "attr('srcs', $fullname, ${fullname//:*/}:*)"

//tensorflow/python:nn_ops_gen

现在转到BUILD内的tensorflow/python文件,您会发现这是tf_gen_op_wrapper_private_py类型的定位,其定义为here,并从gen_op_wrapper_py调用tensorflow/tensorflow.bzl {1}}看起来像这样

def tf_gen_op_wrapper_py(name, out=None, hidden=None, visibility=None, deps=[],
....
      native.cc_binary(
      name = tool_name,

这个native.cc_binary构造是一种让Bazel目标代表任意命令执行的方法。在这种情况下,它使用一些参数调用tool_name。通过几个步骤,您可以找到"工具"这里是从framework/python_op_gen_main.cc

编译的

这种并发症的原因是TensorFlow被设计为与语言无关。因此,在理想世界中,您将使用ops.pbtxt中描述的每个操作,然后每个操作将使用REGISTER_KERNEL_BUILDER为每个硬件类型实现一个实现,因此所有实现都将在C ++ / CUDA / Assembly中完成并自动变为适用于所有语言前端。会有一个等同的翻译操作符如" python_op_gen_main"对于每种语言,将自动生成所有客户端库代码。但是,由于Python占据主导地位,因此在Python方面添加功能的压力很大。所以现在有两种操作 - 在gen_nn_ops.py等文件中看到的纯TensorFlow操作,以及像nn_ops.py这样的文件中只有Python的操作,这些操作通常包含操作自动生成的文件gen_nn_ops.py但是添加额外功能/语法糖。此外,最初所有名称都是驼峰式的,但是决定面向公众的版本应该符合更常见的Python语法的PEP,所以这是同一操作的C ++ / Python接口之间的驼峰/蛇案例不匹配的原因

答案 1 :(得分:5)

不幸的是,TensorFlow代码不易阅读:(

为了加快速度,python代码必须交错C ++代码,它也使用间接依赖。

gen_X函数是从他们的C ++代码生成的;要找到它,您需要搜索Conv2dBackpropInput

您可以在ops/nn_ops.cc中找到内核操作的注册,并在kernels/conv_grad_input_ops.cc中找到具体实现。

答案 2 :(得分:2)

这是构建Tensorflow时生成的文件。 在构建Tensorflow源之后,您应该在tensorflow根目录中看到名为“ bazel-genfiles ”的符号链接文件,然后转到它指向的位置,然后您可以在 tensorflow找到它/python/ops/gen_nn_ops.py

答案 3 :(得分:-1)

我在 google colab 上使用张量流 TF2:

import inspect
inspect.getsourcefile(gen_nn_ops.conv2d_backprop_input)
'/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/gen_nn_ops.py'