web-dev-qa-db-ja.com

テンソルフローのgen_nn_opsからのソースコードを探しています

ディープラーニング用のテンソルフローは初めてで、テンソルフローでのデコンボリューション(畳み込み転置)操作に興味があります。デコンボリューションを操作するためのソースコードを確認する必要があります。関数は、私が推測する conv2d_transpose()in nn_ops.py

ただし、関数では、gen_nn_ops.conv2d_backprop_input()という別の関数を呼び出します。この関数の内容を調べる必要がありますが、リポジトリで見つけることができません。任意の助けをいただければ幸いです。

27
HojjaxX

ソースはbazelによって自動的に生成されるため、このソースは見つかりません。ソースからビルドする場合、このファイルは_bazel-genfiles_内に表示されます。 inspectモジュールを使用して見つけることができるローカルディストリビューションにも存在します。このファイルには、自動的に生成されたPython基礎となるC++実装のラッパーが含まれているため、基本的に1行関数の束で構成されています。生成されたPython opは、スネークケースをラクダケースに変換します。つまり、_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依存関係の痕跡をたどることができます。テンソルフローソースツリーから生成された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 で定義され、_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_を使用してハードウェアタイプごとに1つの実装を持つため、すべての実装はC++/CUDAで行われます/アセンブリして、すべての言語フロントエンドで自動的に利用可能になります。すべての言語に対して「python_op_gen_main」のような同等のトランスレーターopがあり、すべてのクライアントライブラリコードが自動的に生成されます。ただし、Pythonは非常に支配的であるため、Python側に機能を追加する必要がありました。現在、純粋なTensorFlow opsの2種類のopsがあります。 _gen_nn_ops.py_のようなファイル、および_nn_ops.py_のようなファイルのPythonのみのopsは、通常ops自動生成ファイル_gen_nn_ops.py_をラップしますが、追加の機能/構文シュガーを追加します。 -case、しかし一般公開向けのリリースはより一般的なPython構文でPEP準拠であることが決定されたため、これがC++/Pythonインターフェース間のキャメルケース/スネークケースの不一致の理由です同じ操作

40

残念ながら、TensorFlowコードは読みにくいです:(

速くするために、pythonコードはC++コードをインターリーブする必要があり、これも間接的な依存関係を使用します。

gen_X関数は、C++コードから生成されます。それを見つけるには、Conv2dBackpropInputを検索する必要があります。

カーネルopの登録は ops/nn_ops.cc に、具体的な実装は kernels/conv_grad_input_ops.cc にあります。

7
sygi

これは、Tensorflowをビルドするときに生成されるファイルです。 Tensorflowソースをビルドすると、tensorflowルートディレクトリに「bazel-genfiles」という名前のシンボリックリンクファイルが表示され、それが指す場所に移動すると、tensorflow/python/ops/gen_nn_ops.py

2
Jason