正在从gen_nn_ops中查找源代码

2024-09-21 03:17:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我对tensorflow有很深的了解,对tensorflow中的反褶积(卷积转置)操作很感兴趣。我需要看一下操作反褶积的源代码。函数是conv2d_transpose() in nn_ops.py

但是,在函数中,它调用另一个名为gen_nn_ops.conv2d_backprop_input()的函数。我需要看一下这个函数的内部内容,但在存储库中找不到它。任何帮助都将不胜感激。


Tags: 函数inpy内容input源代码tensorflownn
3条回答

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

无法找到此源,因为该源是由bazel自动生成的。如果从源代码生成,您将在bazel-genfiles中看到此文件。它也存在于您的本地发行版中,您可以使用inspect模块找到它。该文件包含自动生成的Python包装器到底层C++实现,因此它基本上由一行一行函数组成。找到这种生成的Python操作的底层C++实现的捷径是将Snake实例转换为CAMEL实例,即{{CD3>}-& G^;^ {CD4>}/P>

# 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依赖项的轨迹。要查找从tensorflow源树生成它的Bazel目标:

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

//tensorflow/python:nn_ops_gen

现在转到tensorflow/python中的BUILD文件,您会看到这是一个类型为tf_gen_op_wrapper_private_py的目标,它被定义为here,并从tensorflow/tensorflow.bzl调用gen_op_wrapper_py,如下所示

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。再经过几个步骤,您可以发现这里的“tool”是从framework/python_op_gen_main.cc编译而来的

造成这种复杂性的原因是TensorFlow被设计成语言不可知论的。因此,在理想世界中,您将拥有在{a3}中描述的每个OP,然后每个OP将使用每一个硬件类型使用^ {CD13}}实现一个,因此所有实现都将在C++ +CUDA/CUTE中完成,并成为所有语言前端自动可用的。每种语言都有一个类似于“python-op-u-gen-u-main”的翻译程序,所有的客户端库代码都将自动生成。然而,由于Python是如此的占主导地位,因此有压力在Python方面添加特性。所以现在有两种操作——纯TensorFlow操作出现在gen_nn_ops.py文件中,Python操作只出现在nn_ops.py文件中,这些文件通常包装ops自动生成的文件gen_nn_ops.py,但添加了额外的功能/语法。此外,最初所有的名字都是CAMEL案例,但是它决定了面向公共发布应该是PEP兼容更常见的Python语法,所以这是Copy/Spy/CASE案例在同一OP/P>之间的C++/Python接口不匹配的原因。

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

为了使事情快速,Python代码必须交错C++代码,它也使用间接依赖关系。

^ {CD1>}函数是由C++代码生成的,要找到它,需要搜索^ {< CD2>}。

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

相关问题 更多 >

    热门问题