18

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

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

  1. setup()メソッド: ここで何をすればよいですか? たとえば、「bottom」パラメータの長さを「2」と比較する必要があるのはなぜですか? なぜ2にする必要があるのですか?任意なのでバッチサイズではないようです? そして、私が理解しているように、一番下はブロブであり、最初の次元はバッチサイズですか?
  2. reshape()方法:私が理解しているように、「下」の入力パラメータは下層のブロブであり、「上」パラメータは上層のブロブであり、フォワードパスを使用した計算の出力形状に従って最上層を再形成する必要があります。しかし、これらの形状がパスごとに変化せず、ウェイトのみが変化する場合、フォワード パスごとにこれを行う必要があるのはなぜですか?
  3. reshapeメソッドには、forward使用される「トップ」入力パラメータのインデックスが 0 あります。andの代わりにtop[0].data=...orを使用する必要があるのはなぜですか? このインデックスは何ですか?このトップリストの他の部分を使用しない場合、なぜこのように公開されているのでしょうか? そのまたは C++ バックボーンの一致を疑うことができますが、正確に知っておくとよいでしょう。top[0].input=...top.data=...top.input=...
  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の場合、勾配をに割り当てる必要がありますが、何もしないだけで内部を循環している場合bottom[X].diff、なぜ誰かが何もしないメソッドを呼び出すのでしょうか?propagate_down = False

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

4

2 に答える 2

17

ここで多くの質問をされました。問題を明確にするために、いくつかのハイライトと指針を示します。私はあなたのすべての質問に明確に答えるつもりはありません。

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

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

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

reshape()(Q.2)の時点で、この関数はフォワード パスごとに呼び出されるわけではなく、入力/出力とパラメーターにスペースを割り当てるためにネットがセットアップされている場合にのみ呼び出されます。
場合によっては、ネット (検出ネットなど) の入力サイズを変更したい場合がありreshape()、新しい入力サイズに対応するためにネットのすべてのレイヤーを呼び出す必要があります。

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

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

于 2015-11-19T06:56:26.653 に答える
0

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

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

ありがとう。

于 2016-04-02T05:42:12.537 に答える