咖啡中的欧几里得损失层

Euclidean Loss Layer in Caffe

本文关键字:几里 损失 咖啡      更新时间:2023-10-16

我目前正在尝试在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()

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

该权重通常用于增加网络的辅助损耗。你可以在谷歌的《Convolations Going Deeper》或《深度监管的篮网》中阅读更多关于它的信息。