Deep learning 基于Caffe的多标签分类

Deep learning 基于Caffe的多标签分类,deep-learning,caffe,lmdb,pycaffe,Deep Learning,Caffe,Lmdb,Pycaffe,我想微调GoogLeNet,用Caffe进行多标签分类。我已经将其微调为单标签分类,但我还不能转换为多标签分类 我正在执行的主要步骤是不同的: 为数据和地面真相创建LMDB 我正在修改代码,用数据创建一个LMDB,用地面真相创建另一个LMDB 将SoftmaxWithLoss替换为SigmoidCrossEntropyLoss 更新train_val.prototxt后,我将SoftmaxWithLoss layers替换为SigmoidCrossEntropyLoss,并设置数据层以便加载两个

我想微调GoogLeNet,用Caffe进行多标签分类。我已经将其微调为单标签分类,但我还不能转换为多标签分类

我正在执行的主要步骤是不同的:

为数据和地面真相创建LMDB 我正在修改代码,用数据创建一个LMDB,用地面真相创建另一个LMDB

将SoftmaxWithLoss替换为SigmoidCrossEntropyLoss 更新train_val.prototxt后,我将SoftmaxWithLoss layers替换为SigmoidCrossEntropyLoss,并设置数据层以便加载两个DB。我设置了学习率参数,就像我对单标签分类问题所做的那样

这些步骤似乎奏效了。数据流,并且可以执行解算器。步骤(1)。为了验证数据和标签是否正确加载,我使用公式显式计算了损失,得到了与Caffe相同的结果

问题 网络不收敛。通过几百次迭代,每个不同的类在类总体上达到平均值。也就是说,如果a类种群中有0.35个1和0.65个0,则无论真实标签如何,网络将收敛到每次观测的~0.35分类概率

可能的错误1 我怀疑问题是因为我没能以GoogLeNet预训练模型可以学习的方式将图像正确加载到caffe中。到目前为止,我以前的经验是convert_imageset,它工作得非常好。现在我正在使用shelhamer代码将图像保存到LMDB中:

im = np.array(Image.open(os.path.join(data_dir,in_)))
im = im[:,:,::-1]
im = im.transpose((2,0,1))
im_dat = caffe.io.array_to_datum(im)
in_txn.put('{:0>10d}'.format(in_idx), im_dat.SerializeToString())
加载图像时,我将数据层中的平均值标准化。 这看起来对吗?还有别的办法吗

可能的错误2 也可能是train_val.prototxt的定义错误。除了切换SoftmaxWithLoss->SigmoidCrossEntropyLoss外,还需要做什么

任何帮助都将不胜感激!
谢谢

在GoogLeNet中,输入数据应减去平均值:

...
im = im.transpose((2,0,1))
mean = np.array((104,117,123))
im -= mean
im_dat = caffe.io.array_to_datum(im)
...

看起来你的网络陷入了一个“全1”的预测。如果梯度太高,将参数驱动到无意义的区域,则可能会发生这种情况。你能画一张训练损失与迭代次数的图表吗?我会尝试将学习率降低一到两个数量级,然后重新训练,看看模型是否再次卡住。如果你的网络没有收敛,你应该检查学习率。一般来说,对于微调,您应该具有较低的学习率(或者一开始就具有较高的学习率和快速衰减)。如果火车损失在几个世纪内不断增加,这表明你的学习率太高。你看到这个问题了吗?