web-dev-qa-db-ja.com

pythonでカスタムCaffeレイヤーを構築する

Python=でCaffeレイヤーを構築することに関する多くのリンクを解析した後でも、いくつかの概念を理解するのはまだ困難です。誰かがそれらを明確にしてくれませんか?

私がまだ欠けているのは:

  1. setup()メソッド:ここで何をすべきですか?例として、「下」パラメータの長さを「2」と比較する必要があるのはなぜですか?なぜ2にする必要があるのですか?任意なので、バッチサイズではないようです。そして、私が理解しているように一番下はブロブで、最初の次元はバッチサイズですか?
  2. reshape()メソッド:「下」の入力パラメーターは下層のblobであり、「上」のパラメーターは上層のblobであることを理解しているため、前方の計算の出力形状に従って、上層を再形成する必要がありますパス。しかし、これらの形状がパスごとに変化せず、重みのみが変化する場合、なぜこれをすべての順方向パスに行う必要があるのですか?
  3. reshapeおよびforwardメソッドには、使用される「トップ」入力パラメーターのインデックスが0です。 top[0].data=...top[0].input=...の代わりにtop.data=...またはtop.input=...を使用する必要があるのはなぜですか?このインデックスについてこのトップリストの他の部分を使用しない場合、なぜこのように公開されるのですか?私はそのまたはC++バックボーンの偶然を疑うことができますが、正確に知っておくとよいでしょう。
  4. reshape()メソッド、次の行:

    if bottom[0].count != bottom[1].count
    

    私はここで何をしますか?なぜその次元は再び2ですか?そして、私はここで何を数えていますか? blobの両方の部分(0と1)が一部のメンバー(count)の量で等しい必要があるのはなぜですか?

  5. forward()メソッド、この行で定義するもの:

    self.diff[...] = bottom[0].data - bottom[1].data
    

    定義した場合、フォワードパスの後に使用するとどうなりますか?そのまま使えますか

    diff = bottom[0].data - bottom[1].data 
    

    代わりに、このメソッドの後半でselfに割り当てずに損失をカウントするか、それとも何らかの目的で実行しますか?

  6. backward()メソッド:これについては何ですか:for i in range(2):?なぜ再び範囲は2ですか?

  7. backward()メソッド、propagate_downパラメータ:なぜ定義されているのですか?つまり、True、gradientがbottom[X].diffに割り当てられているはずですが、propagate_down = Falseで何もしないメソッドを呼び出すのはなぜですか?

これらの質問があまりにも明白である場合は申し訳ありませんが、私はそれらを理解し、ここで助けを求めるための良いガイドを見つけることができませんでした。

18
loknar

あなたはここで多くの質問をしました、私はあなたに問題を明確にすることを望んでいるいくつかのハイライトとポインタをあなたに与えます。すべての質問に明確に回答することはしません。

ブロブとレイヤーの入力/出力の違いについて最も混乱しているようです。実際、ほとんどのレイヤーには入力としてsingleblobがあり、出力としてsingleblobがありますが、常にそうであるとは限りません。損失レイヤーについて考えてみましょう。これには2つの入力があります。予測とグラウンドトゥルースラベルです。したがって、この場合、bottomは長さ2(!)のベクトルであり、_bottom[0]_は予測を表す(4-D)ブロブであり、一方、_bottom[1]_は、ラベルが付いた別のblobです。したがって、そのようなレイヤーを構築するときは、正確に(ハードコードされた)2つの入力blobがあることを確認する必要があります(例: AccuracyLayer 定義のExactNumBottomBlobs()を参照)。

同じことがtopブロブにも当てはまります。実際、ほとんどの場合、レイヤーごとに単一のtopがありますが、常にそうであるとは限りません(たとえば、 AccuracyLayer を参照)。したがって、topは、レイヤーのtopごとに1つずつ、4次元blobのvectorでもあります。ほとんどの場合、そのベクトルには1つの要素が含まれますが、複数の要素が見つかることもあります。

これで質問1、3、4、6がカバーされると思います。

reshape()(Q.2)以降、この関数はすべての転送パスで呼び出されるのではなく、入力/出力とパラメーターにスペースを割り当てるようにnetが設定されている場合にのみ呼び出されます。
場合によっては、ネットの入力サイズ(検出ネットなど)を変更し、新しい入力サイズに対応するためにネットのすべてのレイヤーに対してreshape()を呼び出す必要があります。

_propagate_down_パラメータについて(Q.7):レイヤーには複数のbottomが含まれている可能性があるため、原則として、グラデーションをallにグラデーションを渡す必要がありますbottomsバックプロップ。しかし、損失レイヤーのlabel底部への勾配の意味は何ですか? allbottomsに伝播したくない場合があります。これがこのフラグの目的です。 (ここに があり、3つのbottomsを備えた損失レイヤーがあり、それらすべてに勾配があることを期待しています)。

詳細については、「 this _"Python"_レイヤーチュートリアル 」を参照してください。

17
Shai

なぜ2にする必要があるのですか?

その特定の要旨は、ユークリッド損失層について話している。ユークリッド損失は、2ベクトル間の平均二乗誤差です。したがって、このレイヤーへの入力ブロブには2つのベクトルが必要です。各ベクトルの長さは要素ごとに異なるため、同じでなければなりません。このチェックはreshapeメソッドで確認できます。

ありがとう。

0
gopal_hegde