我正在尝试使用Python层为Caffe定义自定义丢失函数,但我无法澄清什么是必需的输出。 让图层的函数定义为L = sum(F(xi,yi))/ batch_size,其中L是最小化的损失函数(即top [0]),x是网络输出(bottom [0]) ,y是基础真值标签(即底部[1]),xi,yi是批次中的第i个样本。
EuclideanLossLayer(https://github.com/BVLC/caffe/blob/master/examples/pycaffe/layers/pyloss.py)的广为人知的例子表明,在这种情况下,后向级别必须返回bottom[0].diff[i] = dL(x,y)/dxi
。我发现的另一个参考文献显示了相同的内容:Implement Bhattacharyya loss function using python layer Caffe
但在其他例子中我看到它应该乘以top [0] .diff。 1.什么是正确的? bottom [0] [i] = dL / dx或bottom [0] .diff [i] = dL / dxi * top [0] .diff [i]
答案 0 :(得分:1)
每个损失层可能有loss_weight
:表示此特定损失的“重要性”(如果网络有多个损失层)。 Caffe将此权重实现为top[0].diff
,以乘以渐变。
答案 1 :(得分:0)
让我们回到基本原则:反向传播的目的是根据地面实况反馈调整层权重。其中最基本的部分包括“我目前的猜测有多远”和“我应该如何努力改变杠杆?”这些分别形式化为top.diff
和learning_rate
。
在微观层面上,每一层的基本事实是top
反馈,因此top.diff
是“距离多远......”的本地化身。因此,在某些点,您需要在调整计算中包含top[0].diff
作为主要因素。
我知道这不是一个完整,直接的答案 - 但我希望它在你解决眼前的问题后继续提供帮助。