我希望在我的模型中使用InfogainLoss类型的丢失层 . 但我很难正确定义它 .
-
是否有关于
INFOGAIN_LOSS
图层使用的教程/示例? -
此层的输入(类概率)应该是
SOFTMAX
层的输出,还是足以输入完全连接层的"top"?
INFOGAIN_LOSS
需要三个输入:类概率,标签和矩阵 H
. 矩阵 H
可以作为图层参数 infogain_loss_param { source: "fiename" }
提供 .
假设我有一个python脚本,计算 H
为 numpy.array
形状 (L,L)
与 dtype='f4'
(其中 L
是我模型中的标签数) .
-
如何将
numpy.array
转换为可以作为infogain_loss_param { source }
提供给模型的binproto
文件? -
假设我想将
H
作为损失层的第三个输入(底部)提供(而不是作为模型参数) . 我怎样才能做到这一点?
我是否定义了一个新的数据层"top"是H
?如果是这样,那么每次训练迭代都不会增加该层的数据,就像训练数据增加一样?如何定义多个不相关的输入"data"层,以及caffe如何知道从批次后批量读取培训/测试"data"层,而从H
"data"层知道只读一次所有培训过程?
3 回答
我仍然没有完整回答我的问题 . 这个答案仅涵盖我的第三和第四部分:
3.如何将numpy.array转换为binproto文件:
在python中
现在,您可以使用
H
作为参数将INFOGAIN_LOSS
图层添加到模型原型文本中:4.如何加载
H
作为DATA层的一部分引用Evan Shelhamer's post:
至于我问题的前两部分:
1.是否有关于 InfogainLoss 图层使用的教程/示例?:
一个很好的例子可以找到here:使用 InfogainLoss 来解决类不 balancer 问题 .
2.此层的输入(类概率)应该是 Softmax 层的输出吗?
根据Yair's answer答案是YES它应该是 Softmax 图层的输出(或确保输入值在[0..1]范围内的任何其他图层) .
最近,我注意到在
"Softmax"
层上使用"InfogainLoss"
会导致数值不稳定 . 因此,我建议将这两个层组合成一个层(很像"SoftmaxWithLoss"
层) . 该组合层的数学给出here . 可以在this pull request中找到此"combined" infogainLoss Softmax的实现 .该层正在总结
所以p_i需要在(0,1)中作为损失函数才有意义(否则更高的置信度得分会产生更高的损失) . 请参阅下面的曲线,了解log(p)的值 .
我不认为他们必须总结为1,但是通过Softmax层传递它们将实现这两个属性 .
由于我不得不搜索许多网站来拼写完整的代码,我想我分享了我的实现:
用于计算每个类权重的H矩阵的Python层:
以及train_val.prototxt中的相关部分: