2016-04-03 17 views
2

http://www.deeplearningbook.org/contents/convnets.htmlの式9.12を変更して、MxN畳み込みカーネルを中央に配置しました。 1入力1つの出力チャネルを仮定すると、勾配のために、以下の式(今の信仰でそれを取る)を与えるArrayFire(勾配計算)の畳み込みニューラルネットワークのバックプロックの実装

(簡単にするため):

dK(krow, kcol) = sum(G(row, col) * V(row+krow-M/2, col+kcol-N/2); row, col) 

は上記を読み取るために、dKを単一の要素をkrowにおいて、kcolは、シフトされたVのG倍の積のすべての行および列にわたる合計に等しい。注GおよびVは同じ次元を有する。我々はVの外に出てゼロになることを定義する。

たとえば、Gが[abcd]、Vが[wxyz]、Mが3の場合、最初の合計はドット(G、[0 wxy])、2番目の合計はドットG、[wxyz])であり、第3の和はドット(G、[xyz 0])である。

ArrayFireにはシフト操作がありますが、挿入がゼロのシフトではなく、循環シフトが行われます。また、カーネルサイズMxNは、典型的には小さく、例えば7×7であるので、より最適な実装がGおよびVで一度だけ読み取られ、カーネル上に蓄積されるようである。

この1Dの例では、aとw、xを読み込み、[a * 0 aw ax]で開始します。次に、b、yを読み込み、[bw bx by]を追加します。次に、c、zを読み込み、[cx cy cz]を加えます。次にdを読み込み、最後に[dy dz d * 0]を追加します。

ArrayFireでdKを直接計算する方法はありますか?私は助けることができませんが、これは何らかの畳み込みだと思っていますが、私は畳み込みがどのように見えるかを頭で囲むことができませんでした。

+0

合計権利を使用して畳み込み演算を実装しようとしていることに気が付きますか?それは非常に非常に非効率的です。 ArrayFireには 'wrap'と' unwrap'という関数があり、行列乗算で畳み込みを変換することができます。それがあなたが使用する必要があるものです。 –

答えて

2

ああそう。 3x3のdK配列の場合、私はunwrapを使ってMxN入力配列を2つのMxN列ベクトルに変換します。次に、2つの列ベクトルのシフトされたサブセットの9ドット積を行います。いいえ、シフトは2次元であるため動作しません。

1x(MxN)と(MxN)x9の中間配列を作成する必要があります。後者の各列は、サイズが1のパッドボーダを持つ元のシフトMxNウィンドウです。行列の乗算を行います。

Hmm、それはあまりにも多くのメモリを必要とします。したがって、最終的な解決策は、出力3x3でgforを実行し、ループごとに、ラップされていないGとラップされていないVのドット積を行います。

合意しましたか?

関連する問題