InfogainLoss图层

我希望在我的模型中使用InfogainLosstypes的丢失图层。 但是我很难正确定义它。

  1. 有没有关于使用INFOGAIN_LOSS图层的任何教程/例子?

  2. 该层的input,类概率,是否为SOFTMAX层的输出,还是足以input完全连接层的“顶层”?

INFOGAIN_LOSS需要三个input:类概率,标签和matrixH matrixH可以作为层参数infogain_loss_param { source: "fiename" }
假设我有一个python脚本,用numpy.array dtype='f4' (其中L是模型中的标签数(L,L)计算Hnumpy.array的形状(L,L) )。

  1. 我怎样才能将我的numpy.array转换成可以作为infogain_loss_param { source }给模型的binproto文件?

  2. 假设我想把H作为第三个input(底部)提供给损失层(而不是模型参数)。 我该怎么做?
    我是否定义了一个“顶”是H的新数据层? 如果是这样的话,每次训练迭代都不会增加这个层的数据,就像训练数据增加一样? 我如何定义多个不相关的input“数据”层,caffe如何知道从批处理的训练/testing“数据”层中读取,而从H “数据”层知道只读取一次所有训练处理?

我的问题仍然没有完整的答案。 这个答案只涵盖了我的第三和第四部分:
3.如何将numpy.array转换成binproto文件

在python中

 H = np.eye( L, dtype = 'f4' ) import caffe blob = caffe.io.array_to_blobproto( H.reshape( (1,1,L,L) ) ) with open( 'infogainH.binaryproto', 'wb' ) as f : f.write( blob.SerializeToString() ) 

现在,您可以将H作为参数添加到模型prototext INFOGAIN_LOSS图层:

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

4.如何加载H作为数据层的一部分

引用Evan Shelhamer的post :

目前没有办法使数据层以不同的速率加载input。 每个正向传递所有数据层将前进。 但是,通过inputlmdb / leveldb / hdf5文件,只有H,因为数据层将循环并保持加载相同的H,可以完成恒定的Hinput。这明显浪费了磁盘IO。


至于我的问题的前两部分:
1.是否有关于InfogainLoss图层使用的教程/例子?
一个很好的例子可以在这里find:使用InfogainLoss来解决类不平衡。

2.该层的input,类概率,是Softmax层的输出?
根据Yair的回答 ,答案是YES,它应该是Softmax图层的输出(或任何确保input值在[0..1]范围内的图层)。


最近,我注意到,在"Softmax"层上使用"InfogainLoss"会导致数值不稳定。 因此,我build议将这两个图层合并为一个(很像"SoftmaxWithLoss"图层)。 这个组合图层的math在这里给出。 这个“组合”infogainLoss + Softmax的实现可以在这个拉取请求中find。

这一层正在总结

 -log(p_i) 

因此p_i必须在(0,1)中作为损失函数才有意义(否则,高置信度分数将产生更高的损失)。请参阅下面的log(p)值的曲线。

在这里输入图像描述

我不认为他们必须总结为1,但是通过Softmax层传递他们将达到两个属性。

Interesting Posts