我正在尝试建立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
}
}