使用CNN转移学习-为什么要删除最后2层

时间:2018-06-25 07:44:19

标签: python machine-learning keras convolutional-neural-network transfer-learning

在阅读有关CNN中有关转移学习的博客时,通常会说-删除最后一层,或删除最后两层。也就是说,删除输出层和最后一个隐藏层。

因此,如果转移学习意味着还更改成本函数,例如从交叉熵到均方误差,我知道您需要将最后一个输出层从softmax值的1001层更改为输出浮点的Dense(1)层,但是:

  1. 为什么还要更改最后一个隐藏层?
  2. 如果使用Keras且预定义的CNN模型之一是ImageNet权重,则最后两个新层将使用什么权重初始化?例如,它是He初始化还是0初始化?

该问题假定在更改成本函数时也可以应用转移学习,因为转移学习更多是工程实践而不是理论定义。

1 个答案:

答案 0 :(得分:2)

  1. 我认为,稍微修改最后一个隐藏层的激活值,而不是用新的激活值完全替换旧的激活值是一种更常见的做法。

    尽管如此,之所以这样做,是因为最初训练的模型适合于在特定类型的任务上执行良好,例如对ImageNet数据集中的对象进行分类。现在,假设您想要一个分类器,该分类器在对猫和狗进行分类时可提供最先进的性能。您可以使用经过预训练的ImageNet模型来执行此任务,但是由于它经过训练可以识别出比您的任务所需的对象更多的对象,因此它只会给您带来良好的性能,而不是出色的性能。

    在进行迁移学习时,需要修改最后一个隐藏层的原因是微调以使模型在任务中表现良好,同时利用早期隐藏层的优势(如边缘检测等)通过仅训练最后一层的激活值,您可以教会它仅识别所需的对象(在此示例中,仅识别猫和狗)。

    就像您提到的那样,您需要根据评估指标来修改输出层。

  2. 我无法确定在Keras中初始化层的权重,但是由于Pytorch使用random weights而不是零初始化来初始化它的新层,所以我非常有信心Keras会做一些事情相似。