# 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'
这是在构建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>如果您想了解这个文件是如何产生的,那么可以跟踪
BUILD
文件中bazel依赖项的轨迹。要查找从tensorflow源树生成它的Bazel目标:现在转到
tensorflow/python
中的BUILD
文件,您会看到这是一个类型为tf_gen_op_wrapper_private_py
的目标,它被定义为here,并从tensorflow/tensorflow.bzl
调用gen_op_wrapper_py
,如下所示这个
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中找到具体的实现。
相关问题 更多 >
编程相关推荐