2016-10-11 18 views
1

Python層、caffeを使用して私のカスタム損失層を実装しようとしています。私はガイドとしてこのexampleを使用していたし、次のようにforward機能を書いている:私はと完全に慣れていないんだとPython層を使用してBhattacharyyaの損失関数を実装するCaffe

def forward(self,bottom,top): 
     score = 0; 
     self.mult[...] = np.multiply(bottom[0].data,bottom[1].data) 
     self.multAndsqrt[...] = np.sqrt(self.mult) 
     top[0].data[...] = -math.log(np.sum(self.multAndsqrt)) 

はしかし、2番目のタスクは、それがbackward機能を実装していることはちょっと私には非常に困難ですPython。だから、後ろのセクションをコーディングして助けてください。ここ は、コスト関数と実装するためにまともなstocashtic勾配のためのその誘導体である:事前に

enter image description here 感謝。

表中のp [i]は、出力ニューロン値がであることを示します。

+0

レイヤーに 'p'とは何があり、' g'は何ですか? 'bottom [0]'は 'p'で、' bottom [1] 'は' g'ですか?あなたは 'p' *と*' g'に伝播するのですか、あるいはそのうちの一つに伝播しますか? – Shai

+0

はい、正しく、私はpに伝播します。 – Saeed

+0

@Shaiこの実装で私を助けてくれますか? – Saeed

答えて

4

bottom\[1].dataqで、Db(p,q)pq間のバタチャリヤ距離を表し、bottom[0].datapであると言うことができます。

あなたが後方関数内で行う必要がある唯一のものは、その入力(pq)に対するDbの偏微分を計算し、それぞれの底差分塊でそれらを格納することです:

diff_p = dDb(p,q)/dp

def backward(self, top, propagate_down, bottom): 
    if propagate_down[0]: 
     bottom[0].diff[...] = # calculate dDb(p,q)/dp 
    if propagate_down[1]: 
     bottom[1].diff[...] = # calculate dDb(p,q)/dq 
0123:

diff_q = dDb(p,q)/dq

だからあなたの後方関数は次のようになります

通常、バッチの平均(合計ではなく)エラーを使用します。そして、あなたはこのようなものに終わるだろう:あなたはDbの偏微分を計算したら

def forward(self,bottom,top): 
    self.mult[...] = np.multiply(bottom[0].data,bottom[1].data) 
    self.multAndsqrt[...] = np.sqrt(self.mult) 
    top[0].data[...] = -math.log(np.sum(self.multAndsqrt))/bottom[0].num 

def backward(self, top, propagate_down, bottom): 
    if propagate_down[0]: 
     bottom[0].diff[...] = # calculate dDb(p,q)/dp 
           /bottom[0].num 
    if propagate_down[1]: 
     bottom[1].diff[...] = # calculate dDb(p,q)/dq 
           /bottom[1].num 

あなたは往路の機能のために行ったように、あなたは上記のテンプレートに挿入することができます。

+0

、そして最も重要なことは、フォワードパスとバックワードパスのテストを書くこと – Shai

関連する問題