我是 tensorflow 的深度学习新手,对 tensorflow 中的反卷积(卷积转置)操作很感兴趣。我需要看一下操作反卷积的源代码。我猜这个函数是nn_ops.py 中的 conv2d_transpose()。
但是,在函数中它调用另一个名为gen_nn_ops.conv2d_backprop_input()
. 我需要看看这个函数里面有什么,但我无法在存储库中找到它。任何帮助,将不胜感激。
我是 tensorflow 的深度学习新手,对 tensorflow 中的反卷积(卷积转置)操作很感兴趣。我需要看一下操作反卷积的源代码。我猜这个函数是nn_ops.py 中的 conv2d_transpose()。
但是,在函数中它调用另一个名为gen_nn_ops.conv2d_backprop_input()
. 我需要看看这个函数里面有什么,但我无法在存储库中找到它。任何帮助,将不胜感激。
找不到这个源码,因为源码是bazel自动生成的。如果您从源代码构建,您将在bazel-genfiles
. 它也存在于您可以使用inspect
模块找到的本地发行版中。该文件包含对底层 C++ 实现的自动生成的 Python 包装器,因此它基本上由一堆 1 行函数组成。找到这种生成的 Python 操作的底层 C++ 实现的捷径是将蛇案例转换为骆驼案例,即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'
如果你想知道这个文件是如何产生的,你可以跟踪文件中的 bazel 依赖关系BUILD
。它找到从 tensorflow 源树生成它的 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
定义,调用看起来像这样gen_op_wrapper_py
tensorflow/tensorflow.bzl
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 方面存在添加功能的压力。所以现在有两种操作——在文件中看到的纯 TensorFlow 操作gen_nn_ops.py
,和文件中的纯 Python 操作nn_ops.py
,通常包装操作自动生成的文件gen_nn_ops.py
但添加额外的功能/语法糖。此外,最初所有名称都是驼峰式,但决定面向公众的版本应该是 PEP 兼容更常见的 Python 语法,所以这是相同操作的 C++/Python 接口之间驼峰式/蛇式不匹配的原因
不幸的是,TensorFlow 代码不容易阅读 :(
为了让事情变得更快,python 代码必须交错 C++ 代码,这也使用间接依赖关系。
gen_X
函数是从它们的 C++ 代码生成的;要找到它,您需要搜索Conv2dBackpropInput
.
您可以在ops/nn_ops.cc中找到内核操作的注册,并在kernels/conv_grad_input_ops.cc中找到具体实现。
这是构建 TensorFlow 时生成的文件。构建 TensorFlow 源代码后,您应该在 tensorflow 根目录中看到一个名为“ bazel-genfiles ”的符号链接文件,然后转到它指向的位置,然后您可以在tensorflow/python/ops/gen_nn_ops.py找到它
我在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'