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

标签 python tensorflow keras deep-learning classification

再会!

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

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

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

谢谢!

最佳答案

CNN 在为新领域的新任务重新训练时很容易忘记以前学到的知识,这种现象通常称为灾难性遗忘,这是一个活跃且具有挑战性的研究领域。
说到这一点,使模型能够将新类别与旧类别一起分类的一种明显方法是在累积的(旧+新)数据集上从头开始训练(这很耗时。)
相比之下,近年来在(类增量)持续学习的文献中提出了几种替代方法来解决这种情况:

  • 首先,您可以使用旧数据集的一小部分和新数据集来训练新模型,称为基于排练的方法。请注意,您可以训练 GAN 来生成旧类的伪样本,而不是存储原始样本的子集。如图所示,在训练时,使用蒸馏损失来模拟旧模型(权重被压缩)对新模型的预测,有助于避免忘记旧知识:
    enter image description here
  • 其次,由于模型中每个神经元的贡献并不相等,因此在训练新模型时,您可以只更新对旧类不太重要的神经元,以便我们保留旧知识。您可以查看弹性重量合并 (EWC) 论文以了解更多详细信息。
  • 第三,您可以动态扩展模型以提取特定于新类的特征,而不会损害对旧类很重要的权重。您可以查看动态可扩展网络 (DEN) 以了解更多详细信息。
  • 关于python - 如何使用现有的和较新的类微调 keras 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58027839/

    相关文章:

    python - 在 OpenCV 中从 ROI 中裁剪矩形扩展

    python - django 是否存在防止重复表单提交的库?

    swift - 为什么我启用了 Metal API 但我的 Coreml 自定义层仍在 CPU 上运行

    python - 如何使用不可微的损失函数?

    python - 如何将 Keras 丢失输出记录到文件中

    python - 绘制 keras 自定义模型时,“ListWrapper”对象没有属性 'name'

    python - QTableWidget 信号 cellChanged() : distinguish between user input and change by routines

    python - 如何对 2D 列表中的列求和?

    python - 使用 Tensorflow 2.0 模型子类化访问层输入/输出

    python - 是否可以在单个 python 脚本中在多个 GPU 上并行训练多个 Keras 模型?