尝试使用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的实现的衍生:
注意表中的p [i]表示 ith 输出神经元值。
答案 0 :(得分:4)
让我们说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
的偏导数后,您可以将其插入到上面的模板中,就像正确传递函数一样。