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

Posted

技术标签:

【中文标题】如何使用现有的和更新的类微调 keras 模型?【英文标题】:How to fine-tune a keras model with existing plus newer classes? 【发布时间】:2020-01-21 11:33:07 【问题描述】:

美好的一天!

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

CNN 在针对新领域的新任务进行再训练时容易忘记先前学习的知识,这种现象通常被称为灾难性遗忘,这是一个活跃且具有挑战性的研究领域。

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

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

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

【讨论】:

【参考方案2】:

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

制作模型以在新旧类别之间进行分类的整个实验仍在研究领域中。 但是,实现它的一种方法是在整个数据(旧 + 新)上从头开始训练模型。

【讨论】:

以上是关于如何使用现有的和更新的类微调 keras 模型?的主要内容,如果未能解决你的问题,请参考以下文章

python 微调Keras模型。已更新至Keras 2.0 API。

如何微调现有的 TensorFlow 对象检测模型以识别其他类? [关闭]

如何在Keras中使用中级微调?

VGG16 Keras微调:精度低

如何使用OpenAI fine-tuning(微调)训练属于自己专有的ChatGPT模型?

Keras:微调 Inception 时精度下降