簡體   English   中英

使用 python 層 Caffe 實現 Bhattacharyya 損失函數

[英]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].datapbottom\\[1].dataq並且Db(p,q)表示pq之間的 Bhattacharyya 距離。

在向后函數中,您唯一需要做的就是計算Db相對於其輸入( pq )的偏導數,並將它們存儲在各自的底部差異 blob 中:

diff_p = dDb(p,q)/dp

diff_q = dDb(p,q)/dq

所以你的向后函數看起來像:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM