Tackling imbalanced class members in Caffe: 每个实例对损失值的权重贡献

Tackling imbalanced class members in Caffe: weight contribution of each instance to loss value

我有一个高度不平衡的数据,我知道一些用户建议使用 InfoGainLoss loss function,但是,当我尝试将此函数添加到 Caffe layers.[=21= 时,我遇到了一些错误] 我有以下问题,如果有人指导我,我真的很感激:

  1. 如何将这一层添加到 Caffe 中?有谁知道这一层的任何来源/代码?
  2. 我想应用它做图像分割,有些类的比例不一样。如何为我的图像创建 H 矩阵(一堆权重)?以及 infoGainLoss 层如何读取与该特定图像相关的特定权重矩阵 (H)?
  3. 在caffe中添加cppcu版本的InforGainLoss层后,是否需要重新制作Caffe?

不好意思问了几个问题,但都是我关心的问题,而且都是相互关联的。如果能得到一些帮助和支持,我将不胜感激。 谢谢

1.If 你从当前 infogain_loss_layer.cpp 复制你可以很容易地适应。对于前向传球改变线 59-66 如:

// assuming num = batch size, dim = label size, image_dim = image height * width
Dtype loss = 0;
for (int i = 0; i < num; ++i) {
  for(int k = 0; k < image_dim; k++) {
    int label = static_cast<int>(bottom_label[i*image_dim+k]);
    for (int j = 0; j < dim; ++j) {
      Dtype prob = std::max(bottom_data[i *image_dim *dim+ k * dim + j], Dtype(kLOG_THRESHOLD));
      loss -= infogain_mat[label * dim + j] * log(prob);
    }
  }
}

类似地,对于向后传递,您可以像这样更改第 95-101 行:

for (int i = 0; i < num; ++i) {
  for(int k = 0; k < image_dim; k++) {
    const int label = static_cast<int>(bottom_label[i*image_dim+k]);
    for (int j = 0; j < dim; ++j) {
      Dtype prob = std::max(bottom_data[i *image_dim *dim+ k * dim + j], Dtype(kLOG_THRESHOLD));
      bottom_diff[i *image_dim *dim+ k * dim + j] = scale * infogain_mat[label * dim + j] / prob;
    }
  }
}

这有点天真。我似乎没有找到任何优化选项。您还需要在 reshape 中更改一些设置代码。

2.In this PR suggestion is that for diagonal entries in H put min_count/|i| where |i| is the number of samples has label i. Everything else as 0. Also see 。至于加载权重矩阵 H 对于所有输入都是固定的。您可以将其作为 lmdb 文件或以其他方式加载。

3.Yes 您将需要重建。

更新: 因为 Shai pointed out the infogain pull 这周已经批准了。所以当前版本的caffe支持pixelwise infogain loss。