如何使用现有和较新的类微调 keras 模型?

Sye*_*mza 4 python classification deep-learning keras tensorflow

再会!

我有一个名人数据集,我想在其中微调 keras 内置模型。到目前为止,我已经探索和完成了,我们移除了原始模型的顶层(或者最好通过 include_top=False)并添加我们自己的层,然后训练我们新添加的层,同时保持之前的层冻结。这整个事情很像直觉。

现在我需要的是,我的模型学会识别名人面孔,同时还能够检测它之前训练过的所有其他对象。最初,在 imagenet 上训练的模型带有 1000 个神经元的输出层,每个神经元代表一个单独的类。我对它应该如何检测新类感到困惑?所有的迁移学习和微调文章和博客都告诉我们用不同的 N 神经元层(N = 新类的数量)替换原来的 1000 个神经元输出层。就我而言,我有两个名人,所以如果我有一个带有 2 个神经元的新层,我不知道模型将如何对原始的 1000 个 imagenet 对象进行分类。

我需要一个关于这整个事情的指针,我究竟如何才能让一个预训练的模型教两个新的名人面孔,同时还保持其识别所有 1000 个 imagenet 对象的能力。

谢谢!

Kau*_*Roy 6

CNN 在为新领域的新任务重新训练时很容易忘记以前学到的知识,这种现象通常称为灾难性遗忘,这是一个活跃且具有挑战性的研究领域。

说到这一点,使模型能够将新类别与旧类别一起分类的一种明显方法是在累积的(旧+新)数据集上从头开始训练(这很耗时。)

相比之下,近年来在(类增量)持续学习的文献中提出了几种替代方法来解决这种情况:

  1. 首先,您可以使用旧数据集的一小部分和新数据集来训练新模型,称为基于排练的方法。请注意,您可以训练 GAN 来生成旧类的伪样本,而不是存储原始样本的子集。如图所示,在训练时,使用蒸馏损失来模拟旧模型(权重被压缩)对新模型的预测,有助于避免忘记旧知识: 在此处输入图片说明
  2. 其次,由于模型中每个神经元的贡献并不相等,因此在训练新模型时,您可能只更新对旧类不太重要的神经元,以便我们保留旧知识。您可以查看弹性重量合并 (EWC) 论文以了解更多详细信息。
  3. 第三,您可以动态扩展模型以提取特定于新类的特征,而不会损害对旧类很重要的权重。您可以查看动态可扩展网络 (DEN) 以了解更多详细信息。


Ris*_*wat 3

通过迁移学习,您可以使用从新数据集中学到的特征以及模型从最初训练的数据集中学到的特征,使训练后的模型在刚刚训练的新类之间进行分类。不幸的是,您无法使模型在所有类(原始数据集类+第二次使用的数据集类)之间进行分类,因为当您添加新类时,它仅保留它们的权重用于分类。但是,假设您在实验中更改了最后一层中输出神经元的数量(等于旧类 + 新类的数量),那么它现在将为这些神经元赋予随机权重,而这在预测中不会给您带来有意义的结果。

制作模型在新旧类别实验之间进行分类的整个过程仍然处于研究领域。然而,实现这一目标的一种方法是在整个数据(旧数据+新数据)上从头开始训练模型。