使用python层Caffe实现Bhattacharyya损失函数

时间:2016-10-11 12:21:01

标签: python python-2.7 caffe pycaffe

尝试使用python layer,caffe实现我的自定义丢失层。我已使用此example作为指南,并编写了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完全不熟悉。所以请帮我编写后面的部分。 以下是成本函数及其对stocashtic gradient的实现的衍生:

enter image description here 提前谢谢。

注意表中的p [i]表示 ith 输出神经元值。

1 个答案:

答案 0 :(得分:4)

让我们说bottom[0].datapbottom\[1].dataqDb(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的偏导数后,您可以将其插入到上面的模板中,就像正确传递函数一样。