使用 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].data
是 p
,bottom\[1].data
是 q
,Db(p,q)
表示 p
和 [=15 之间的 Bhattacharyya 距离=].
您在反向函数中唯一需要做的就是计算 Db
关于其输入(p
和 q
)的偏导数,并存储它们在各自的底部差异斑点中:
所以你的后向函数看起来像:
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
的偏导数,就可以将它们插入到上面的模板中,就像对前向传递函数所做的那样。
尝试使用 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].data
是 p
,bottom\[1].data
是 q
,Db(p,q)
表示 p
和 [=15 之间的 Bhattacharyya 距离=].
您在反向函数中唯一需要做的就是计算 Db
关于其输入(p
和 q
)的偏导数,并存储它们在各自的底部差异斑点中:
所以你的后向函数看起来像:
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
的偏导数,就可以将它们插入到上面的模板中,就像对前向传递函数所做的那样。