在张量流中从gen_nn_ops寻找源代码
deep-learning
python
tensorflow
12
0

我是深度学习tensorflow的新手,并且对tensorflow中的反卷积(卷积转置)操作感兴趣。我需要看一下操作反卷积的源代码。我猜函数是nn_ops.py中的conv2d_transpose()

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

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

您找不到此来源,因为该来源由bazel自动生成。如果从源代码构建, bazel-genfilesbazel-genfiles看到此文件。它也存在于您的本地发行版中,您可以使用inspect模块找到它。该文件包含自动生成的用于基础C ++实现的Python包装器,因此它基本上由一串1行函数组成。查找此类生成的Python op的基础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'

如果您想了解该文件的真正来源,则可以遵循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类型的目标,该目标已在此处定义并从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_name 。通过几个步骤,您可以发现此处的“工具”是从framework / python_op_gen_main.cc编译的

这种复杂性的原因是TensorFlow被设计为与语言无关。因此,在理想情况下,您将在ops.pbtxt中描述每个操作,然后每个操作将使用REGISTER_KERNEL_BUILDER 针对每种硬件类型具有一个实现,因此所有实现将在C ++ / CUDA / Assembly中完成,并且可自动用于所有语言-结束。每种语言都会有一个等效的翻译器操作,例如“ python_op_gen_main”,并且所有客户端库代码都会自动生成。但是,由于Python如此占主导地位,因此有压力在Python方面添加功能。所以现在有两种操作-在诸如gen_nn_ops.py文件中看到的纯TensorFlow操作,以及在诸如nn_ops.py文件中的仅Python的操作,它们通常包装自动生成的操作gen_nn_ops.py但增加了额外的功能/语法糖。同样,最初所有名称都是驼峰大小写的,但决定面向公众的发行版应与更通用的Python语法兼容PEP,因此这是相同op的C ++ / Python接口之间驼峰大小写/蛇形大小写不匹配的原因

收藏
评论

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

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

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

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

收藏
评论

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号