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= 时,我遇到了一些错误]
我有以下问题,如果有人指导我,我真的很感激:
- 如何将这一层添加到 Caffe 中?有谁知道这一层的任何来源/代码?
- 我想应用它做图像分割,有些类的比例不一样。如何为我的图像创建
H
矩阵(一堆权重)?以及 infoGainLoss 层如何读取与该特定图像相关的特定权重矩阵 (H)?
- 在caffe中添加
cpp
和cu
版本的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。
我有一个高度不平衡的数据,我知道一些用户建议使用 InfoGainLoss
loss function,但是,当我尝试将此函数添加到 Caffe layers
.[=21= 时,我遇到了一些错误]
我有以下问题,如果有人指导我,我真的很感激:
- 如何将这一层添加到 Caffe 中?有谁知道这一层的任何来源/代码?
- 我想应用它做图像分割,有些类的比例不一样。如何为我的图像创建
H
矩阵(一堆权重)?以及 infoGainLoss 层如何读取与该特定图像相关的特定权重矩阵 (H)? - 在caffe中添加
cpp
和cu
版本的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。