<p>无法找到此源,因为该源是由bazel自动生成的。如果从源代码生成,您将在<code>bazel-genfiles</code>中看到此文件。它也存在于您的本地发行版中,您可以使用<code>inspect</code>模块找到它。该文件包含自动生成的Python包装器到底层C++实现,因此它基本上由一行一行函数组成。找到这种生成的Python操作的底层C++实现的捷径是将Snake实例转换为CAMEL实例,即{{CD3>}-& G^;^ {CD4>}/P>
<pre><code># 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'
</code></pre>
<p>如果您想了解这个文件是如何产生的,那么可以跟踪<code>BUILD</code>文件中bazel依赖项的轨迹。要查找从tensorflow源树生成它的Bazel目标:</p>
<pre><code>fullname=$(bazel query tensorflow/python/ops/gen_nn_ops.py)
bazel query "attr('srcs', $fullname, ${fullname//:*/}:*)"
//tensorflow/python:nn_ops_gen
</code></pre>
<p>现在转到<code>tensorflow/python</code>中的<code>BUILD</code>文件,您会看到这是一个类型为<code>tf_gen_op_wrapper_private_py</code>的目标,它被定义为<a href="https://github.com/tensorflow/tensorflow/blob/754048a0453a04a761e112ae5d99c149eb9910dd/tensorflow/python/build_defs.bzl" rel="noreferrer">here</a>,并从<code>tensorflow/tensorflow.bzl</code>调用<code>gen_op_wrapper_py</code>,如下所示</p>
<pre><code>def tf_gen_op_wrapper_py(name, out=None, hidden=None, visibility=None, deps=[],
....
native.cc_binary(
name = tool_name,
</code></pre>
<p>这个<code>native.cc_binary</code>构造是一种让Bazel目标表示任意命令执行的方法。在本例中,它使用一些参数调用<code>tool_name</code>。再经过几个步骤,您可以发现这里的“tool”是从<a href="https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/BUILD#L273" rel="noreferrer">framework/python_op_gen_main.cc</a>编译而来的</p>
<p>造成这种复杂性的原因是TensorFlow被设计成语言不可知论的。因此,在理想世界中,您将拥有在{a3}中描述的每个OP,然后每个OP将使用每一个硬件类型使用^ {CD13}}实现一个,因此所有实现都将在C++ +CUDA/CUTE中完成,并成为所有语言前端自动可用的。每种语言都有一个类似于“python-op-u-gen-u-main”的翻译程序,所有的客户端库代码都将自动生成。然而,由于Python是如此的占主导地位,因此有压力在Python方面添加特性。所以现在有两种操作——纯TensorFlow操作出现在<code>gen_nn_ops.py</code>文件中,Python操作只出现在<code>nn_ops.py</code>文件中,这些文件通常包装ops自动生成的文件<code>gen_nn_ops.py</code>,但添加了额外的功能/语法。此外,最初所有的名字都是CAMEL案例,但是它决定了面向公共发布应该是PEP兼容更常见的Python语法,所以这是Copy/Spy/CASE案例在同一OP/P>之间的C++/Python接口不匹配的原因。