我如何重新训练模型而不会丢失带有新数据集的早期模型数据

Posted

技术标签:

【中文标题】我如何重新训练模型而不会丢失带有新数据集的早期模型数据【英文标题】:How do i retrain the model without losing the earlier model data with new set of data 【发布时间】:2020-01-22 17:39:27 【问题描述】:

就我目前的需求而言,我有一个包含 100 个不同人的 10k+ 人脸的数据集,我从中训练了一个用于识别人脸的模型。该模型是通过从 facenet_keras.h5 模型中获取 128 个向量并将这些向量值馈送到 Dense 层以对人脸进行分类来训练的。 但我目前面临的问题是

    如果要训练一张人脸,我必须重新训练整个模型。

我应该如何应对这个挑战?我读过一个叫做迁移学习的概念,但我不知道如何实现它。请就这个问题提出你的建议。有什么可能的解决方案?

【问题讨论】:

你到底想做什么?为您的特定 100 人重新训练原始网络,还是在训练后将新人添加到数据库中? 【参考方案1】:

通过迁移学习,您可以复制现有的预训练模型,并将其用于与原始模型不同但相似的数据集。在您的情况下,如果您想训练模型以识别您的特定 100 人,这将是您需要做的。

如果你已经这样做了,并且你想在数据库中添加另一个人而不必重新训练完整的模型,那么我会冻结所有层(为所有层设置layer.trainable = False),除了最终的全连接层(或最后几层)。然后我会将最后一层(有 100 个节点)替换为有 101 个节点的层。您甚至可以将权重复制到前 100 个节点,也可以冻结它们(我不确定这在 Keras 中是否可行)。在这种情况下,您将重复使用所有经过训练的卷积层等,并教模型识别这张新面孔。

【讨论】:

嘿@wohe1,我不知道如何使用标签添加新人,因为我正在使用 tf.keras.utils.to_categorical 进行单热编码,它从 0 索引开始, 我怎样才能将新标签附加到最后,请帮我解决这个问题。 当前你有一个 N×100 的数组,你可以创建一个大小为 N×101 的新数组,用零填充,并将第一个数组的值复制到最后一个。然后为新面孔添加新条目 所以,让我简要描述一下我正在研究的内容,因此我设置了来自不同 100 个人的 10k 张面孔。我所做的是首先从我的数据集中存在的每张脸中获取 128d 向量值, 在获得这些向量之后,我使用密集层对其进行了训练,因此在训练之前,我将数据分成两部分(通过使用 to_categorical 进行单热编码)测试和训练。我有一个包含文件夹名称 0-100 的数据集,所以我拆分数据的时间(y_data 数组是标签,它的大小是(10000,1))。所以,如果我想通过添加一个带有标签的新人来重新训练模型,在这里我需要再次将数据分成两部分,训练和测试,所以这里的索引从零开始,它会覆盖模型数据。 我不确定你的问题是什么,首先:128d 向量值是什么意思?【参考方案2】:

您可以通过以下方式保存您的权重来保存您的训练结果:

model.save_weights('my_model_weights.h5')

在您将新图像添加到数据集后,稍后再次加载它们以恢复您的训练:

model.load_weights('my_model_weights.h5')

【讨论】:

以上是关于我如何重新训练模型而不会丢失带有新数据集的早期模型数据的主要内容,如果未能解决你的问题,请参考以下文章

新数据集在现有模型下运行不好

Caffe:如何使用已经训练好的模型一次检查多个数据集的准确性?

如何在 Spark Streaming 中仅在新批次上重新训练模型(不采用以前的训练数据集)?

如何在新数据到来时重新训练 pyspark 中保存的线性回归 ML 模型

如何重新训练/更新 keras 模型?

如何使用 tensorflow 或 keras 重新训练具有新子集的线性回归模型?