Caffe中的欧几里德损失层

Bit*_*ver 8 c++ deep-learning caffe

我目前正在尝试在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();
    
    Run Code Online (Sandbox Code Playgroud)
  • 同样,在中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
    
    Run Code Online (Sandbox Code Playgroud)

    如果我的第一个假设是正确的,并且top[0]->cpu_diff()确实保留了上面层的误差导数,为什么我们只使用第一个元素top[0]->cpu_diff()[0],而不是乘以整个向量即top[0]->cpu_diff()

Or *_*rir 13

对于损耗图层,没有下一层,因此顶部diff blob在技术上未定义且未使用 - 但Caffe正在使用此预分配空间来存储不相关的数据:Caffe支持将损耗图层与用户定义的权重相乘(prototxt中的loss_weight) ),此信息(单个标量浮点数)存储在顶部blob的diff数组的第一个元素中.这就是为什么你会在每个损失层中看到它们乘以该数量以支持该功能.这在Caffe关于损失层的教程中有解释.

该权重通常用于向网络添加辅助损耗.您可以在Google的"深入讨论"深度监督的网络中阅读更多相关信息.