Борьба с несбалансированными учениками в Caffe: весовой вклад каждого экземпляра в ценность потери

У меня очень несбалансированные данные, я знаю, что некоторые пользователи предлагают использовать InfoGainLoss Функция потери, однако, я столкнулся с несколькими ошибками, когда я пытался добавить эту функцию в Caffe layers,
У меня есть следующие вопросы, я действительно ценю, если кто-то направляет меня:

  1. Как я могу добавить этот слой в Caffe? Кто-нибудь знает какие-либо источники / коды этого слоя?
  2. Я хочу применить это для сегментации изображения, и пропорция некоторых классов изменяется. Как я могу создать H матрица (стек весов) для моих изображений? И как слой infoGainLoss может считывать матрицу определенного веса (H), связанную с этим конкретным изображением?
  3. После добавления cpp а также cu версия слоя InforGainLoss для кафе, я должен переделать Caffe?

Я прошу прощения за несколько вопросов, но все они мои заботы и связаны друг с другом. Я буду благодарен за помощь и поддержку. Спасибо

1 ответ

Решение

1. Если вы копируете из текущего 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;
    }
  }
}

Это наивно. Кажется, я не могу найти никакой возможности для оптимизации. Вам также необходимо изменить некоторые настройки кода в форме.

2. В этом PR предполагается, что для диагональных записей в H положил min_count/|i| где |i| это количество образцов имеет label i, Все остальное как 0. Также посмотрите это. Что касается загрузки весовой матрицы H фиксируется для всего ввода. Вы можете загрузить его как файл lmdb или другими способами.

3. Да, вам нужно будет восстановить.

Обновление: Как указал Shai, информация об этом уже была одобрена на этой неделе. Таким образом, текущая версия caffe поддерживает потерю информации в пиксельном потоке.

Другие вопросы по тегам