Борьба с несбалансированными учениками в Caffe: весовой вклад каждого экземпляра в ценность потери
У меня очень несбалансированные данные, я знаю, что некоторые пользователи предлагают использовать InfoGainLoss
Функция потери, однако, я столкнулся с несколькими ошибками, когда я пытался добавить эту функцию в Caffe layers
,
У меня есть следующие вопросы, я действительно ценю, если кто-то направляет меня:
- Как я могу добавить этот слой в Caffe? Кто-нибудь знает какие-либо источники / коды этого слоя?
- Я хочу применить это для сегментации изображения, и пропорция некоторых классов изменяется. Как я могу создать
H
матрица (стек весов) для моих изображений? И как слой infoGainLoss может считывать матрицу определенного веса (H), связанную с этим конкретным изображением? - После добавления
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 поддерживает потерю информации в пиксельном потоке.