ディープラーニング用のテンソルフローは初めてで、テンソルフローでのデコンボリューション(畳み込み転置)操作に興味があります。デコンボリューションを操作するためのソースコードを確認する必要があります。関数は、私が推測する conv2d_transpose()in nn_ops.py 。
ただし、関数では、gen_nn_ops.conv2d_backprop_input()
という別の関数を呼び出します。この関数の内容を調べる必要がありますが、リポジトリで見つけることができません。任意の助けをいただければ幸いです。
ソースは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インターフェース間のキャメルケース/スネークケースの不一致の理由です同じ操作
残念ながら、TensorFlowコードは読みにくいです:(
速くするために、pythonコードはC++コードをインターリーブする必要があり、これも間接的な依存関係を使用します。
gen_X
関数は、C++コードから生成されます。それを見つけるには、Conv2dBackpropInput
を検索する必要があります。
カーネルopの登録は ops/nn_ops.cc に、具体的な実装は kernels/conv_grad_input_ops.cc にあります。
これは、Tensorflowをビルドするときに生成されるファイルです。 Tensorflowソースをビルドすると、tensorflowルートディレクトリに「bazel-genfiles」という名前のシンボリックリンクファイルが表示され、それが指す場所に移動すると、tensorflow/python/ops/gen_nn_ops.py