我正在尝试建立caffe的信息获取损失层,以使其正常工作。我看过这些帖子,解决方案,但对我来说仍然无效

我的数据lmdb尺寸为Nx1xHxW(灰度图像),我的目标图像lmdb尺寸为Nx3xH / 8xW / 8(rgb图像)。我最后一个卷积层的尺寸是1x3x20x80。 output_size为3,
 所以我有3个类,因为我在目标lmdb图像数据集中的标签号是(0,1,2)。

我想尝试信息增益损失层,因为我认为我遇到了课程失衡的问题。我的大多数图像包含太多背景。

在我最后的卷积层(conv3)之后,我有这些:

 layer {
    name: "loss"
    type: "SoftmaxWithLoss"
    bottom: "conv3"
    top: "loss"
 }


 layer {
    bottom: "loss"
    bottom: "label"
    top: "infoGainLoss"
    name: "infoGainLoss"
    type: "InfogainLoss"
    infogain_loss_param {
      source: "infogainH.binaryproto"
    }
 }


我的信息获取矩阵是通过InfogainLoss layer帖子生成的(如Shai所建议的),因此我的H矩阵是1x1x3x3维度(一个单位矩阵)。所以我的L是3,因为我有3个班级。
当我运行prototxt文件时,一切都很好(尺寸还可以),但是在最后一个卷积层(conv3层)之后,出现以下错误:


 I0320 14:42:16.722874  5591 net.cpp:157] Top shape: 1 3 20 80 (4800)
 I0320 14:42:16.722882  5591 net.cpp:165] Memory required for data:   2892800
 I0320 14:42:16.722892  5591 layer_factory.hpp:77] Creating layer loss
 I0320 14:42:16.722900  5591 net.cpp:106] Creating Layer loss
 I0320 14:42:16.722906  5591 net.cpp:454] loss <- conv3
 I0320 14:42:16.722913  5591 net.cpp:411] loss -> loss
 F0320 14:42:16.722928  5591 layer.hpp:374] Check failed: ExactNumBottomBlobs() == bottom.size() (2 vs. 1) SoftmaxWithLoss Layer takes 2 bottom blob(s) as input.



我再次检查,每个lmdb数据集文件名都已正确设置。我不知道可能是什么问题。任何想法?

亲爱的@Shai

谢谢您的回答。正如您提到的,我做了以下工作:

 layer {
    name: "prob"
    type: "Softmax"
    bottom: "conv3"
    top: "prob"
    softmax_param { axis: 1 }
 }

 layer {
    bottom: "prob"
    bottom: "label"
    top: "infoGainLoss"
    name: "infoGainLoss"
    type: "InfogainLoss"
    infogain_loss_param {
        source: "infogainH.binaryproto"
    }
 }


但是我仍然有错误:

Top shape: 1 3 20 80 (4800)
I0320 16:30:25.110862  6689 net.cpp:165] Memory required for data: 2912000
I0320 16:30:25.110867  6689 layer_factory.hpp:77] Creating layer infoGainLoss
I0320 16:30:25.110877  6689 net.cpp:106] Creating Layer infoGainLoss
I0320 16:30:25.110884  6689 net.cpp:454] infoGainLoss <- prob
I0320 16:30:25.110889  6689 net.cpp:454] infoGainLoss <- label
I0320 16:30:25.110896  6689 net.cpp:411] infoGainLoss -> infoGainLoss
F0320 16:30:25.110965  6689 infogain_loss_layer.cpp:35] Check failed: bottom[1]->height() == 1 (20 vs. 1)

最佳答案

什么地方出了错?

您的错误来自"loss"层,而不是"InfogainLoss"层:您将输出类概率的"Softmax"层与输出(标量)损失值的"SoftmaxWithLoss"层混淆了。

你该怎么办?


"loss"层替换为"prob"层类型的"Softmax"层:

layer {
  name: "prob"
  type: "Softmax" # NOT SoftmaxWithLoss
  bottom: "conv3"
  top: "prob"
  softmax_param { axis: 1 } # compute prob along 2nd axis
}

您需要计算第二维的损耗,目前看来"InfogainLoss"层不支持此功能。您可能需要调整"InfogainLoss"图层以具有"SoftmaxWithLoss"之类的功能,该功能允许沿任意轴计算损耗。
更新:我在BVLC/caffe上创建了一个pull request,用于“升级”信息增益损失层。像您追求的那样,此升级版本支持“沿轴方向的损耗”。此外,由于它在内部计算概率,因此使“ Softmax”层变得多余(请参见this thread)。
升级后的层可以像这样使用:

layer {
  bottom: "conv3" # prob is computed internally
  bottom: "label"
  top: "infoGainLoss"
  name: "infoGainLoss"
  type: "InfogainLoss"
  infogain_loss_param {
    source: "infogainH.binaryproto"
    axis: 1  # compute loss and probability along axis
  }
}

08-25 04:46