2

既存のconv2d()とほぼ同じですが、特別な関数を追加したいと思います。TensorFlowのカスタマイズされたtf.nn.conv2d()を作成するには?

5x5フィルタの形状と100x100入力の形状を仮定します。私の理解で

、conv2d()内部的に行います。

  1. が全体の入力から5×5の入力エリアを選択します。
  2. 5x5入力領域とフィルタの畳み込みを計算します。
  3. 次の入力領域に所定のストライドで移動します。

    1. 全体の入力から5×5の入力エリアを選択:対照的に

    は、customized_conv2d()は内部でやりたいです。 (同じ)

  4. 5x5入力領域の各値からスカラー値f(5x5入力領域)を減算します。 (追加)
  5. 5x5入力領域とフィルタの減算値の畳み込みを計算します。 (同じ)
  6. 次の入力領域に所定のストライドで移動します。 (同じ)

ここで、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.cctensorflow/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で実行することもできます。

+0

基本的に、畳み込みを行う前にスカラー値を減算したいのですが、そうですか?もしそうなら、あなたは新しいconv2dをコーディングする必要があり、それはとても簡単だと思います。前に説明したことを行うだけです。しかし、私はそれがC言語でコード化されており、Pythonは単なるラッパーであることを知っているので、元の畳み込みと同じ速さで実行することは期待できません。このカスタム畳み込み関数を作成し、オリジナルの畳み込み関数と同じ速さにしたい場合(私はそれがGPUについて尋ねる理由だと思います)、それはもっと時間がかかります。 – kuonb

+0

@kuonb、あなたはポイントを持っています!ありがとう! – Tora

+0

https://stackoverflow.com/questions/43700282/is-there-way-to-add-normalization-to-conv2d-in-tensorflow –

答えて

3

畳み込み自体は線形であるため、最初にtf.nn.conv2dを介して畳み込みを行い、その操作を行うことで線形演算を挿入できます。

5x5パッチの(max(x) + min(x))/2(tf.nn.max_pool(x) - tf.nn.max_pool(-x)) * 0.5で実現できます。 convの後でこれを減算するには、畳み込みカーネルの対応する和で結果を倍にする必要もあります。その後、非線形活性化関数を適用することができます。

しかし、一般に、非線形演算を効率的に追加する方法はわかりません。畳み込み乗算の前に各5x5パッチのzスコアを取得します。おそらく他の答えがいくつかの洞察を提供するかもしれない。

+0

それは素晴らしいです! **(a)**カーネルサイズが5x5でストライド値が(1,1)で、同じパディングがf(x)である 'max_pool'の使用。 **(b)**同じパラメータに5 x 5を乗じたものに 'avg_pool'を適用すると、フィルタの5x5パッチの合計が得られます。 **(c)**要素ごとに(a)と(b)を掛け合わせると、どれだけ減算すべきかがわかります。最後に、 'conv2d'の出力から(c)を減算します。正しい軌道にいるのですか? – Tora

関連する問題