【问题标题】:Multi-label classification with Caffe使用 Caffe 进行多标签分类
【发布时间】:2016-01-18 15:32:40
【问题描述】:

我想微调 GoogLeNet 以使用 Caffe 进行多标签分类。我已经将它微调为单标签分类,但我还不能过渡到多标签。

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

为数据和基本事实创建 LMDB

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

将 SoftmaxWithLoss 替换为 SigmoidCrossEntropyLoss

更新 train_val.prototxt,我将 SoftmaxWithLoss 层替换为 SigmoidCrossEntropyLoss,并设置数据层以便加载两个 DB。我像处理单标签分类问题一样设置学习率参数。

此步骤似乎有效。数据流,可以执行solver.step(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 还有什么需要做的吗?

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

【问题讨论】:

  • 您的网络似乎陷入了“全为 1”的预测。如果您的梯度太高将参数驱动到无意义的区域,则可能会发生这种情况。你能画出训练损失与迭代次数的关系图吗?我会尝试将学习率降低一到两个数量级并重新训练,看看模型是否再次卡住。
  • 如果你的网络没有收敛,你应该检查学习率。通常,对于微调,您应该具有较低的学习率(或一开始就具有较高的学习率并快速衰减)。如果训练损失随着时间的推移而增加,则表明您的学习率太高。
  • 你看到这个问题了吗? github.com/BVLC/caffe/issues/2407

标签: deep-learning caffe lmdb pycaffe


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 2016-03-05
    • 2019-03-25
    • 2017-03-07
    • 2017-03-15
    • 2019-09-24
    • 2016-05-09
    • 2017-06-03
    相关资源
    最近更新 更多