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

Implement Bhattacharyya loss function using python layer Caffe

尝试使用 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。所以请帮助我编写向后部分的代码。 这是要实现的随机梯度下降的成本函数及其导数:

提前致谢。

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

假设 bottom[0].datapbottom\[1].dataqDb(p,q) 表示 p 和 [=15 之间的 Bhattacharyya 距离=].

您在反向函数中唯一需要做的就是计算 Db 关于其输入(pq)的偏导数,并存储它们在各自的底部差异斑点中:

所以你的后向函数看起来像:

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 的偏导数,就可以将它们插入到上面的模板中,就像对前向传递函数所做的那样。