【问题标题】:looking for source code of from gen_nn_ops in tensorflow在tensorflow中寻找gen_nn_ops的源代码
【发布时间】:2017-04-30 02:04:11
【问题描述】:

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

但是,在函数中,它调用了另一个名为 gen_nn_ops.conv2d_backprop_input() 的函数。我需要看看这个函数里面有什么,但我无法在存储库中找到它。任何帮助将不胜感激。

【问题讨论】:

    标签: python tensorflow deep-learning deconvolution


    【解决方案1】:

    很遗憾,TensorFlow 代码不易阅读:(

    为了加快速度,python 代码必须交错 C++ 代码,这也使用间接依赖。

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

    内核操作的注册在ops/nn_ops.cc,具体实现在kernels/conv_grad_input_ops.cc

    【讨论】:

      【解决方案2】:

      你找不到这个来源,因为这个来源是 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'
      

      如果你想知道这个文件是如何产生的,你可以在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 类型的目标,它定义为here 并从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。再走几步,你会发现这里的“工具”是从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,但添加了额外的功能/语法糖。此外,最初所有名称都是驼峰式,但决定面向公众的版本应该是 PEP 兼容更常见的 Python 语法,所以这是相同操作的 C++/Python 接口之间驼峰式/蛇式不匹配的原因

      【讨论】:

      • 嗨,当我输入 inspect.getsourcefile('gen_nn_ops.conv2d_backprop_input') 时,我得到 TypeError: 'gen_nn_ops.conv2d_backprop_input' is not a module, class, method, function, traceback, frame, or code对象
      • 我的 tf 版本是 '1.2.1'。我应该如何解决这个问题?
      • 我猜你缺少导入
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我在 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'
        

        【讨论】:

          猜你喜欢
          • 2011-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多