我目前正在尝试在caffe中实现我自己的损失层,并且在尝试这样做时,使用其他图层作为参考。然而,困扰我的一件事是在top[0]->cpu_diff()
中使用Backward_cpu
。我将使用EuclideanLossLayer
作为参考。这是我的问题
我的理解是top[0]->cpu_diff()
保留了下一层的误差导数,但是如果没有其他层,它是如何初始化的呢?因为它在EuclideanLossLayer
中使用而不执行任何检查:
const Dtype alpha = sign * top[0]->cpu_diff()[0] / bottom[i]->num();
同样,在EuclideanLossLayer
中,使用以下代码段计算与激活相关的错误的衍生物:
const Dtype alpha = sign * top[0]->cpu_diff()[0] / bottom[i]->num();
caffe_cpu_axpby(
bottom[i]->count(), // count
alpha, // alpha
diff_.cpu_data(), // a
Dtype(0), // beta
bottom[i]->mutable_cpu_diff()); // b
如果我的第一个假设是正确的,并且top[0]->cpu_diff()
确实保留了上面层的误差导数,为什么我们只使用第一个元素即top[0]->cpu_diff()[0]
而不是乘以整个向量即top[0]->cpu_diff()
答案 0 :(得分:13)
对于损耗图层,没有下一层,因此顶部diff blob在技术上未定义且未使用 - 但Caffe正在使用此预分配空间来存储不相关的数据:Caffe支持将损耗图层与用户定义的权重相乘(loss_weight在原型文本中),此信息(单个标量浮点数)存储在顶部blob的diff数组的第一个元素中。这就是为什么您会在每个损失层中看到它们乘以该数量以支持该功能的原因。这在Caffe's tutorial about the loss layer中解释。
此权重通常用于为网络添加辅助损耗。您可以在Google Going Deeper with Convoltions或Deeply-Supervised Nets中详细了解相关信息。