我目前正在尝试在 caffe 中实现我自己的损失层,在尝试这样做的同时,我使用其他层作为参考。然而,让我困惑的一件事是使用top[0]->cpu_diff()
in 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()
?
对于损失层,没有下一层,因此顶部 diff blob 在技术上是未定义和未使用的 - 但 Caffe 使用此预分配空间来存储不相关的数据:Caffe 支持将损失层与用户定义的权重(prototxt 中的 loss_weight)相乘),此信息(单个标量浮点数)存储在顶部 blob 的 diff 数组的第一个元素中。这就是为什么您会在每个损失层中看到它们乘以该数量以支持该功能。这在中进行了解释Caffe关于损失层的教程 http://caffe.berkeleyvision.org/tutorial/loss.html.
该权重通常用于向网络添加辅助损失。您可以在 Google 中阅读更多相关信息深入研究卷积 http://arxiv.org/abs/1409.4842 or in 深度监督网络 http://arxiv.org/abs/1409.5185.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)