既存のconv2d()とほぼ同じですが、特別な関数を追加したいと思います。TensorFlowのカスタマイズされたtf.nn.conv2d()を作成するには?
5x5フィルタの形状と100x100入力の形状を仮定します。私の理解で
、conv2d()内部的に行います。
- が全体の入力から5×5の入力エリアを選択します。
- 5x5入力領域とフィルタの畳み込みを計算します。
- 次の入力領域に所定のストライドで移動します。
- 全体の入力から5×5の入力エリアを選択:対照的に
は、customized_conv2d()は内部でやりたいです。 (同じ)
- 5x5入力領域の各値からスカラー値f(5x5入力領域)を減算します。 (追加)
- 5x5入力領域とフィルタの減算値の畳み込みを計算します。 (同じ)
- 次の入力領域に所定のストライドで移動します。 (同じ)
ここで、f(x)がある(MAX(X)+分(X))/ 2
- が、それは使いやすいですが、それを作るには?
- カスタマイズされたコードはGPU上で実行できますか?
nn_ops.py、gen_nn_ops.py、およびnn_ops.ccの関連するソースコードを参照して、私はあなたの助けを求めるようになります。
ありがとうございます!
追加:
私がこれまで学んだこと:
1)カスタマイズされたTensorFlowを行うことがあるかもしれないCPU上で実行するための最も簡単な方法。可能であれば、tensorflow/core/kernels/conv_ops.ccとtensorflow/core/kernels/deep_conv2d.ccを調整してください。この特殊なTensorFlowを使用すると、conv2d()は元のものではなく、望ましい方法で動作します。関連する行を複製し、すべての関数/メソッドの名前をPythonラッパーからC++コードに変更することにより、customize_conv2d()などの新しいオペレーションを追加することは、この場合には過度の努力になる可能性があります。
2)CUDAを介してGPUで実行することはできません。 TensorFlowのconv2d()は、最終的にNVIDIA CUDAディープニューラルネットワークライブラリ(cuDNN)のcudnnConvolutionForward()を呼び出しているようです。 conv2d()の主要な部分はこのライブラリで行われます。 Software License Agreement (SLA) for NVIDIA cuDNNはリバースエンジニアリングまたは変更を許可していません。ライブラリのソースコードは提供されていません。
3)OpenCLを使用してGPUで実行することもできます。
基本的に、畳み込みを行う前にスカラー値を減算したいのですが、そうですか?もしそうなら、あなたは新しいconv2dをコーディングする必要があり、それはとても簡単だと思います。前に説明したことを行うだけです。しかし、私はそれがC言語でコード化されており、Pythonは単なるラッパーであることを知っているので、元の畳み込みと同じ速さで実行することは期待できません。このカスタム畳み込み関数を作成し、オリジナルの畳み込み関数と同じ速さにしたい場合(私はそれがGPUについて尋ねる理由だと思います)、それはもっと時間がかかります。 – kuonb
@kuonb、あなたはポイントを持っています!ありがとう! – Tora
https://stackoverflow.com/questions/43700282/is-there-way-to-add-normalization-to-conv2d-in-tensorflow –