为什么在keras中使用像InceptionResnetV2这样的预训练模型时,我们include_top = False?

时间:2019-01-06 07:08:46

标签: tensorflow keras deep-learning conv-neural-network

使用预训练的Imagenet模型进行图像分类。我无法理解参数中的include_top = False。我知道它最终会删除完全连接的层。我也想知道如何决定哪种预训练模型用于哪种图像分类任务?

2 个答案:

答案 0 :(得分:1)

您的问题与转学有关。 一般来说,用于图像分类的CNN模型可以分为2部分:

  1. 第一部分是特征提取器,这部分工作是直观地查找图像中的特征(或将图像编码到特征的下部空间中),该部分的输出应告诉您是否有尾巴,眼睛,面部例如...中的图片。
  2. 第二部分是分类器,这部分工作是获取编码的图像(特征提取器的输出)并将图像分类为所需的类,例如,如果它看到尾巴,猫眼和猫脸,就可以告诉它猫。

当您进行转移学习时,您希望使用训练有素的特征提取器,因为它的工作是查找大多数情况下将用于分类任务的特征(这句话带有一个很大的假设,即您对任务的输入有些类似于训练特征提取器的输入)。 当您进行转学时,您需要重新训练分类器,因为现在它应该对不同的类别进行分类,并且仅对数据进行分类。

在CNN模型中,大多数时候特征提取器是卷积的图层,而完全连接的是分类器,无论如何在ImageNet模型中都是这种情况。这就是为什么他们在进行迁移学习并重新培训它们时会删除完全连接的层的原因。

对于第二个问题,大多数时候您应该采用最佳的可用模型(取决于您的性能/内存限制),因为他可能具有最强大的特征提取器。

有关转移学习的更多信息(只需在Google上搜索): ftp://ftp.cs.wisc.edu/machine-learning/shavlik-group/torrey.handbook09.pdf

答案 1 :(得分:0)

  

我无法理解

中的include_top = False

如果看一下代码,这是一个简单的if-else条件:

if include_top:
    # Classification block
    x = layers.Flatten(name='flatten')(x)
    x = layers.Dense(4096, activation='relu', name='fc1')(x)
    x = layers.Dense(4096, activation='relu', name='fc2')(x)
    x = layers.Dense(classes, activation='softmax', name='predictions')(x)
else:
    if pooling == 'avg':
        x = layers.GlobalAveragePooling2D()(x)
    elif pooling == 'max':
        x = layers.GlobalMaxPooling2D()(x)

如果设置include_top=True,它将使用预先训练的权重重新初始化密集层,否则将忽略它。如果设置include_top=False,则上一层的输出将通过GlobalAvreagePooling2D()传递,该提取出最重要的特征。

  

我想知道如何决定使用哪种预训练模型   什么样的图像分类任务?

每个模型都有其优点和缺点。参数的数量,训练时间,推断时间,准确性和其他一些因素使研究人员偏爱一种模型而不是另一种。没有在每个任务或数据集上都能胜任的模型[请参见免费启动theorem]