InfogainLoss图层
我希望在我的模型中使用InfogainLoss
types的丢失图层。 但是我很难正确定义它。
-
有没有关于使用
INFOGAIN_LOSS
图层的任何教程/例子? -
该层的input,类概率,是否为
SOFTMAX
层的输出,还是足以input完全连接层的“顶层”?
INFOGAIN_LOSS
需要三个input:类概率,标签和matrixH
matrixH
可以作为层参数infogain_loss_param { source: "fiename" }
。
假设我有一个python脚本,用numpy.array
dtype='f4'
(其中L
是模型中的标签数(L,L)
计算H
为numpy.array
的形状(L,L)
)。
-
我怎样才能将我的
numpy.array
转换成可以作为infogain_loss_param { source }
给模型的binproto
文件? -
假设我想把
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层传递他们将达到两个属性。