[英]Implement Bhattacharyya loss function using python layer Caffe
嘗試使用 python 層,caffe 實現我的自定義損失層。 我使用這個例子作為指導,並編寫了如下的forward
函數:
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))
但是,第二個任務,即實現backward
功能對我來說有點困難,因為我完全不熟悉 python。 所以請幫我編碼落后部分。 這是要實現的隨機梯度下降的成本函數及其導數:
請注意,表中的 p[i] 表示第i 個輸出神經元值。
讓我們說bottom[0].data
是p
, bottom\\[1].data
是q
並且Db(p,q)
表示p
和q
之間的 Bhattacharyya 距離。
在向后函數中,您唯一需要做的就是計算Db
相對於其輸入( p
和q
)的偏導數,並將它們存儲在各自的底部差異 blob 中:
所以你的向后函數看起來像:
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
請注意,您通常使用批次的平均(而不是總)誤差。 然后你會得到這樣的結果:
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
一旦計算了Db
的偏導數,您就可以將它們插入到上面的模板中,就像對前向傳遞函數所做的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.