Python で Caffe レイヤーを構築することに関する多くのリンクを解析した後でも、いくつかの概念を理解するのにまだ困難があります。誰かがそれらを明確にしてもらえますか?
- ネットワークのブロブと重みの python 構造は、ここで説明されています:入力に関する Caffe conv-filter の勾配の検索。
- ネットワークとソルバーの構造はここで説明されています: caffe / pycaffe のチートシート? .
- Python レイヤーを定義する例は次のとおりです: pyloss.py on git。
- ここでレイヤーテスト: gitでレイヤーをテストします。
- C++ 用の新しいレイヤーの開発については、ここで説明されています: git wiki。
私がまだ欠けているのは:
setup()
メソッド: ここで何をすればよいですか? たとえば、「bottom」パラメータの長さを「2」と比較する必要があるのはなぜですか? なぜ2にする必要があるのですか?任意なのでバッチサイズではないようです? そして、私が理解しているように、一番下はブロブであり、最初の次元はバッチサイズですか?reshape()
方法:私が理解しているように、「下」の入力パラメータは下層のブロブであり、「上」パラメータは上層のブロブであり、フォワードパスを使用した計算の出力形状に従って最上層を再形成する必要があります。しかし、これらの形状がパスごとに変化せず、ウェイトのみが変化する場合、フォワード パスごとにこれを行う必要があるのはなぜですか?reshape
メソッドには、forward
使用される「トップ」入力パラメータのインデックスが 0 あります。andの代わりにtop[0].data=...
orを使用する必要があるのはなぜですか? このインデックスは何ですか?このトップリストの他の部分を使用しない場合、なぜこのように公開されているのでしょうか? そのまたは C++ バックボーンの一致を疑うことができますが、正確に知っておくとよいでしょう。top[0].input=...
top.data=...
top.input=...
reshape()
メソッド、次の行:if bottom[0].count != bottom[1].count
私はここで何をしますか?なぜその次元は再び 2 なのですか? そして、私はここで何を数えていますか?BLOB の両方の部分 (0 と 1) の一部のメンバー (
count
) の量が等しくなければならないのはなぜですか?forward()
メソッド、この行で定義するもの:self.diff[...] = bottom[0].data - bottom[1].data
定義した場合、フォワードパスの後に使用されるのはいつですか? 使えますか
diff = bottom[0].data - bottom[1].data
代入せずにこのメソッドの後半で損失をカウントする代わりに
self
、または何らかの目的で行われますか?backward()
メソッド: これは何ですか:for i in range(2):
? なぜ再び範囲が2なのですか?backward()
メソッド、propagate_down
パラメーター: なぜ定義されているのですか? 私が見ているように、そのTrueの場合、勾配をに割り当てる必要がありますが、何もしないだけで内部を循環している場合bottom[X].diff
、なぜ誰かが何もしないメソッドを呼び出すのでしょうか?propagate_down = False
これらの質問があまりにも明白である場合は申し訳ありませんが、私はそれらを理解するための良いガイドを見つけることができず、ここで助けを求めることができませんでした.