Hoj*_*axX 29 python deep-learning tensorflow deconvolution
我是深度学习的tensorflow的新手,并且对tensorflow中的反卷积(卷积转置)操作感兴趣.我需要看看操作反卷积的源代码.函数是我猜nn_ops.py中的conv2d_transpose().
但是,在函数中它调用另一个函数调用gen_nn_ops.conv2d_backprop_input()
.我需要看看这个函数里面有什么,但我无法在存储库中找到它.任何帮助,将不胜感激.
Yar*_*tov 41
您找不到此源,因为源是由bazel自动生成的.如果你从源代码构建,你会在里面看到这个文件bazel-genfiles
.它也存在于您可以使用inspect
模块找到的本地发行版中.该文件包含自动生成的基础C++实现的Python包装器,因此它基本上由一堆1行函数组成.查找此类生成的Python操作的基础C++实现的快捷方式是将snake case转换为camel case,即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'
Run Code Online (Sandbox Code Playgroud)
如果你想知道这个文件是如何实现的,你可以跟踪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
Run Code Online (Sandbox Code Playgroud)
所以,现在要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,
Run Code Online (Sandbox Code Playgroud)
此native.cc_binary
构造是一种让Bazel目标表示任意命令执行的方法.在这种情况下,它调用tool_name
一些参数.通过几个步骤,您可以发现这里的"工具"是从framework/python_op_gen_main.cc编译的
造成这种复杂情况的原因是TensorFlow被设计为与语言无关.因此,在理想世界中,您将拥有ops.pbtxt中描述的每个op ,然后每个op将使用每种硬件类型实现一个实现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
但添加额外的功能/语法糖.此外,最初所有名称都是驼峰式的,但是决定面向公众的版本应该符合更常见的Python语法的PEP,所以这是同一操作的C++/Python接口之间的驼峰/蛇案例不匹配的原因
不幸的是,TensorFlow代码不容易阅读:(
为了使事情更快,Python代码必须交织C ++代码,该代码也使用间接依赖关系。
gen_X
函数是从其C ++代码生成的;要找到它,您需要搜索Conv2dBackpropInput
。
您可以在ops / nn_ops.cc中找到内核op的注册,并在kernels / conv_grad_input_ops.cc中找到具体的实现。
归档时间: |
|
查看次数: |
9826 次 |
最近记录: |