首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们在include_top=False中使用像InceptionResnetV2这样的预先训练过的模型呢?

为什么我们在include_top=False中使用像InceptionResnetV2这样的预先训练过的模型呢?
EN

Stack Overflow用户
提问于 2019-01-06 07:08:46
回答 2查看 5.1K关注 0票数 3

使用预先训练的Imagenet模型进行图像分类。在讨论中,我无法理解include_top = False,我知道它在结束时删除了完全连接的层。另外,我想知道如何确定哪种预先训练过的模型用于哪种图像分类任务?

EN

回答 2

Stack Overflow用户

发布于 2019-01-06 08:30:56

你的问题与转移学习有关。一般来说,用于图像分类的CNN模型可分为两部分:

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

当您转移学习时,您希望使用经过训练的特征提取器,因为它的工作是查找大部分时间都将在您的分类任务中的特性(这句话附带了一个很大的假设,即您的任务的输入与特征提取器所接受的输入有点类似)。当你进行转移学习时,你需要重新训练分类器,因为现在它应该对不同的类进行分类,只对你的数据进行分类器的训练。

在CNN模型中,特征提取器大多是卷积层,完全连通的是分类器,ImageNet模型也是如此。这就是为什么他们删除完全连接层时,做转移,学习和再培训他们。

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

更多关于转移学习的信息(只是google it):ftp://ftp.cs.wisc.edu/machine-learning/shavlik-group/torrey.handbook09.pdf

票数 8
EN

Stack Overflow用户

发布于 2019-01-06 08:25:05

我无法理解include_top = False在

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

代码语言:javascript
复制
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,,它将创建一个分类层(用于微调),否则,将通过GlobalAvreagePooling2D()使用前一层的输出(用于特征提取)。

我想知道如何决定哪种预先训练过的模型用于哪种图像分类任务?

每一种模式都有自己的优缺点。参数的数量、训练时间、推理时间、准确性以及其他一些因素都是导致研究人员倾向于一个模型而不是另一个模型的原因。没有一个模型可以在每个任务或数据集见无自由发射[定理]上表现出色。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54059391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档