Sha*_*hai 16 numpy protocol-buffers neural-network deep-learning caffe
我希望InfogainLoss在我的模型中使用类型的损失层.但我很难正确定义它.
关于INFOGAIN_LOSS图层的使用是否有任何教程/示例?
这个层的输入,类概率,应该是SOFTMAX层的输出,还是足以输入完全连接层的"顶部"?
INFOGAIN_LOSS需要三个输入:类概率,标签和矩阵H.矩阵H可以作为层参数提供infogain_loss_param { source: "fiename" }.
假设我有一个计算一个Python脚本H的numpy.array形状(L,L)与dtype='f4'(其中L是标签在我的模型的数量).
如何将我转换numpy.array为binproto可以作为infogain_loss_param { source }模型提供的文件?
假设我想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层的一部分加载
目前无法使数据层以不同的速率加载输入.每个前向传递所有数据层都将前进.但是,常量H输入可以通过使输入lmdb/leveldb/hdf5文件仅为H来完成,因为数据层将循环并继续加载相同的H.这显然浪费了磁盘IO.
至于我的问题的前两部分:
1.是否有关于InfogainLoss层使用的教程/示例?:
在这里可以找到一个很好的例子:使用InfogainLoss来解决类不平衡问题.
2.此层的输入(类概率)是否应为Softmax层的输出?
根据Yair的回答,答案是肯定的,它应该是Softmax层的输出(或确保输入值在[0..1]范围内的任何其他层).
最近,我注意到"Softmax"在"SoftmaxWithLoss"图层顶部使用会导致数值不稳定.因此,我建议将这两个层组合成一个层(很像"Softmax"层).这里给出了这个组合层的数学.可以在此拉取请求中找到此"组合"infogainLoss + Softmax的实现.
| 归档时间: |
|
| 查看次数: |
5837 次 |
| 最近记录: |