美好的一天!
我有一个名人数据集,我想在其上微调keras内置模型。到目前为止,我已经进行了探索和完成的工作,我们移除了原始模型的顶层(或者最好传递include_top = False)并添加自己的图层,然后训练新添加的图层,同时保持先前的图层冻结。这整个过程很像直观。
现在我需要的是,我的模型学会识别名人脸,同时还能够检测以前训练过的所有其他物体。最初,在imagenet上训练的模型带有1000个神经元的输出层,每个神经元代表一个单独的类。我对应该如何检测新类感到困惑?所有的转移学习和微调文章以及博客都告诉我们,用不同的N神经元层(N =新类数)替换原始的1000神经元输出层。就我而言,我有两个名人,所以如果我有一个带有2个神经元的新层,我不知道该模型如何对原始的1000个imagenet对象进行分类。
在这整个过程中,我需要一个指针,那就是我怎样才能拥有一个经过预先训练的模型来教两个新的名人面孔,同时还要保持其识别所有1000个imagenet对象的能力。
谢谢!
答案 0 :(得分:1)
通过转移学习,您可以使用从新数据集中学习的特征和从模型中首先训练的数据集中学习的特征,将训练后的模型分类为您刚刚训练的新类。 。不幸的是,您无法使模型在所有类之间进行分类(原始数据集类+第二次使用的数据集类),因为添加新类时,它仅将其权重用于分类。 但是,假设要进行实验,则在最后一层中更改输出神经元的数量(等于旧+新类的数量),然后它将对这些神经元进行随机加权,这在预测时不会给您有意义的结果。
使模型在新旧实验之间进行分类的整个工作仍在研究领域中。 但是,实现此目标的一种方法是从头开始对整个数据(旧+新)进行模型训练。
答案 1 :(得分:1)
在针对新领域的新任务进行培训时,CNN容易忘记先前学到的知识,这种现象通常被称为灾难性遗忘,这是一个活跃而具有挑战性的研究领域。
关键点在于,使模型能够对新类和旧类进行分类的一种显而易见的方法是从头开始对耗时的累积(旧+新)数据集进行训练。 另一方面,使用转移学习方法,可以冻结骨架模型的权重以进行特征提取,并使用新类/节点的目标数量来学习输出层的权重(来自新数据集)。因此,我们失去了以前学到的知识。 最后,解决您的问题的一种解决方法(即,使模型适用于新旧类)是连接旧的和新的输出层,并保持固定的主干,如图所示:
更准确地说,您可以使用冻结的主干和输出层中旧的+新的类数来构建新模型,然后以专门的方式从前两个模型(预训练和新训练的模型)中加载输出层的权重。 / p>