在阅读有关CNN中有关转移学习的博客时,通常会说-删除最后一层,或删除最后两层。也就是说,删除输出层和最后一个隐藏层。
因此,如果转移学习意味着还更改成本函数,例如从交叉熵到均方误差,我知道您需要将最后一个输出层从softmax值的1001层更改为输出浮点的Dense(1)层,但是:
该问题假定在更改成本函数时也可以应用转移学习,因为转移学习更多是工程实践而不是理论定义。
答案 0 :(得分:2)
我认为,稍微修改最后一个隐藏层的激活值,而不是用新的激活值完全替换旧的激活值是一种更常见的做法。
尽管如此,之所以这样做,是因为最初训练的模型适合于在特定类型的任务上执行良好,例如对ImageNet数据集中的对象进行分类。现在,假设您想要一个分类器,该分类器在对猫和狗进行分类时可提供最先进的性能。您可以使用经过预训练的ImageNet模型来执行此任务,但是由于它经过训练可以识别出比您的任务所需的对象更多的对象,因此它只会给您带来良好的性能,而不是出色的性能。
在进行迁移学习时,需要修改最后一个隐藏层的原因是微调以使模型在任务中表现良好,同时利用早期隐藏层的优势(如边缘检测等)通过仅训练最后一层的激活值,您可以教会它仅识别所需的对象(在此示例中,仅识别猫和狗)。
就像您提到的那样,您需要根据评估指标来修改输出层。
我无法确定在Keras中初始化层的权重,但是由于Pytorch使用random weights而不是零初始化来初始化它的新层,所以我非常有信心Keras会做一些事情相似。