首页 文章

使用Caffe进行多标签分类

提问于
浏览
8

我想微调GoogLeNet与Caffe进行多标签分类 . 我已经将它调整为单标签分类,但我还是无法过渡到多标签 .

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

为数据和地面真相创建LMDB

我正在修改代码herehere以创建一个带有数据的LMDB,另一个带有基本事实 .

用SigmoidCrossEntropyLoss替换SoftmaxWithLoss

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

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

问题

网络没有收敛 . 运行几个迭代的hundrads,每个不同的类平均围绕类群 . 也就是说,如果类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之外还有什么需要做的吗?

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

1 回答

  • 0

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

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

相关问题