InfogainLoss层

Sha*_*hai 16 numpy protocol-buffers neural-network deep-learning caffe

我希望InfogainLoss在我的模型中使用类型的损失层.但我很难正确定义它.

  1. 关于INFOGAIN_LOSS图层的使用是否有任何教程/示例?

  2. 这个层的输入,类概率,应该是SOFTMAX层的输出,还是足以输入完全连接层的"顶部"?

INFOGAIN_LOSS需要三个输入:类概率,标签和矩阵H.矩阵H可以作为层参数提供infogain_loss_param { source: "fiename" }.
假设我有一个计算一个Python脚本Hnumpy.array形状(L,L)dtype='f4'(其中L是标签在我的模型的数量).

  1. 如何将我转换numpy.arraybinproto可以作为infogain_loss_param { source }模型提供的文件?

  2. 假设我想H作为损失层的第三个输入(底部)提供(而不是作为模型参数).我怎样才能做到这一点?
    我是否定义了一个"顶部"的新数据层H?如果是这样,那么每次训练迭代都不会增加该层的数据,就像训练数据增加一样?如何定义多个不相关的输入"数据"层,以及caffe如何知道从批处理批量读取训练/测试"数据"层,而从H"数据"层知道只读一次所有的训练过程?

Sha*_*hai 10

我仍然没有完整回答我的问题.这个答案仅涵盖我的第三和第四部分:
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() )
Run Code Online (Sandbox Code Playgroud)

现在,您可以添加到模型prototext的"InfogainLoss"与层"Softmax"作为一个参数:

layer {
  bottom: "topOfPrevLayer"
  bottom: "label"
  top: "infoGainLoss"
  name: "infoGainLoss"
  type: "InfogainLoss"
  infogain_loss_param {
    source: "infogainH.binaryproto"
  }
}
Run Code Online (Sandbox Code Playgroud)

4.如何"InfogainLoss"作为DATA层的一部分加载

引用Evan Shelhamer的帖子:

目前无法使数据层以不同的速率加载输入.每个前向传递所有数据层都将前进.但是,常量H输入可以通过使输入lmdb/leveldb/hdf5文件仅为H来完成,因为数据层将循环并继续加载相同的H.这显然浪费了磁盘IO.


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

2.此层的输入(类概率)是否应为Softmax层的输出?
根据Yair的回答,答案是肯定的,它应该是Softmax层的输出(或确保输入值在[0..1]范围内的任何其他层).


最近,我注意到"Softmax""SoftmaxWithLoss"图层顶部使用会导致数值不稳定.因此,我建议将这两个层组合成一个层(很像"Softmax"层).这里给出了这个组合层的数学.可以在此拉取请求中找到此"组合"infogainLoss + Softmax的实现.