在深度学习网络中添加新的对象类

机器算法验证 机器学习 深度学习 图像处理
2022-04-11 08:39:32

假设我有一个训练有素的深度学习网络,可以检测图像中的 10 类对象(道路、天空、树木等)。它接收 RGB 图像并输出大小为 的概率图,(img_col, img_row, n_class)最终的分割将是argmax对最后一维的操作。

现在我想在网络中添加一个新的类,例如行人,这样经过训练后,网络将能够检测到图像中的行人。

但我不再拥有旧的训练数据。相反,我有一个新数据集,其中也包含行人,但只有行人被标记使用新数据集进行训练(使用旧权重作为初始化)将是最直接的方法,但我想听听其他一些方法。

谁能分享一些关于如何实现这一点的想法?

4个回答

您至少应该重新训练分类层。当您添加另一个输出时,在学习新类期间,另一个类激活必须显式(sigmoid)或隐式(softmax)收缩。但是,至少学习最后一个特征层可能会更好,因为会有一些有用的特征来识别行人。

另一种方法是将新类输入网络并从输出中收集置信度。低置信度可能表明另一个类不属于之前学习的任何类。当然,这种方法也可以给除行人或网络学习的任何类以外的其他类提供低置信度。此外,NN 是一种非局部泛化方法。它很容易以高置信度对完全垃圾的图像进行分类(如果您好奇,请参阅对抗性示例)。

在提出这个问题几年后,有几次尝试解决这个问题。

我最好的猜测是:

  • 在最后一层添加一个类

  • 用新数据训练行人对应的类

  • 尽量不要改变网络使用蒸馏预测其他类的方式。这可能需要一些其他数据,而不是行人数据,其中出现其他类别(汽车,看,显微镜,...)。好消息是,如果您能够对这些进行采样(可能通过互联网),您不必为它们贴上标签即可使该技术发挥作用。如果带有行人标签的新数据与最初用于训练网络的数据来自相同的分布,那么您甚至不必考虑这一点。

这种技术的一个例子可以在这篇论文中找到:https ://arxiv.org/abs/1708.06977

您可以通过搜索以下主题找到其他相关论文:“持续学习”、“终身学习”、“灾难性遗忘”。

[编辑]

我最近阅读并喜欢这些相关文章:Learning without forgetting 、iCaRLEnd-to-End Incremental Learning

为了添加一个类,您几乎肯定需要一个不同结构的网络(即+1 输出)。根据您的问题,您可能还需要更多隐藏节点或输入。当然,正如您所提到的,您可以简单地根据所有新数据重新训练参数,但是,您将失去原始数据集的所有好处。

一种可能性是使用原始数据集中的权重初始化您的新网络(或至少相同数量的输入/隐藏/输出参数),然后在新数据上进行训练。这几乎肯定会加快这个过程,并在某种程度上保留来自第一个数据集的原始信息,假设它泛化得足够好。

我不知道它是否可行,但一种方法是在输出 softmax 层中添加一个新神经元并使用梯度下降进行训练,但只更新该新类的权重。

这可能是一种非常次优的方法,但值得一试。