【问题标题】:Implement Bhattacharyya loss function using python layer Caffe使用 python 层 Caffe 实现 Bhattacharyya 损失函数
【发布时间】:2016-10-11 12:21:00
【问题描述】:

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

提前致谢。

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

【问题讨论】:

  • 你的层中p 和g 是什么? bottom[0] 是 p 和 bottom[1] 是 g?你传播回p 和 g,还是只传播到其中一个?
  • 是的,正确,我传播回p。
  • @Shai 你能帮我完成这个实现吗?

标签: python python-2.7 caffe pycaffe


【解决方案1】:

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

【讨论】:

  • 最重要的是,为向前和向后传递编写一个测试
猜你喜欢
  • 2017-06-20
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 2015-09-14
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
相关资源
最近更新 更多