首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在tensorflow中查找来自gen_nn_ops的源代码

在tensorflow中查找来自gen_nn_ops的源代码
EN

Stack Overflow用户
提问于 2016-12-15 00:40:11
回答 4查看 12.8K关注 0票数 37

我刚接触tensorflow进行深度学习,对tensorflow中的解卷积(卷积转置)操作很感兴趣。我需要看一下操作反卷积的源代码。我猜这个函数是conv2d_transpose() in nn_ops.py

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

EN

回答 4

Stack Overflow用户

发布于 2016-12-15 02:25:59

你找不到这个源码,因为它是由bazel自动生成的。如果从源代码构建,您将在bazel-genfiles中看到此文件。它也存在于您的本地发行版中,您可以使用inspect模块找到它。该文件包含对底层C++实现自动生成的Python包装器,因此它基本上由一堆单行函数组成。找到这种生成的Python op的底层C++实现的捷径是将蛇的情况转换为骆驼的情况,即conv2d_backprop_input -> Conv2dBackpropInput

代码语言:javascript
复制
# 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目标:

代码语言:javascript
复制
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,如下所示

代码语言:javascript
复制
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/汇编语言完成,并自动可用于所有语言前端。对于每种语言,都会有一个等效的翻译器op,比如"python_op_gen_main“,所有的客户端库代码都会自动生成。然而,由于Python占主导地位,因此在Python端添加特性是有压力的。所以现在有两种操作--在像gen_nn_ops.py这样的文件中看到的纯TensorFlow操作,以及像nn_ops.py这样的文件中仅有的操作,它们通常包装了自动生成的文件gen_nn_ops.py,但添加了额外的功能/语法糖。此外,最初所有名称都是驼峰大小写,但决定面向公共的发行版应该与更常见的Python语法的PEP兼容,因此这是同一op的C++/Python接口之间驼峰大小写/蛇形大小写不匹配的原因

票数 50
EN

Stack Overflow用户

发布于 2016-12-15 00:56:04

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

为了更快,python代码必须交错C++代码,这也使用了间接依赖关系。

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

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

票数 8
EN

Stack Overflow用户

发布于 2018-06-05 05:18:16

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41147734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档