【问题标题】:Use pretrained model with different input shape and class model使用具有不同输入形状和类模型的预训练模型
【发布时间】:2019-02-07 09:27:36
【问题描述】:

我正在使用 CNN 处理分类问题,其中我的输入图像大小为 64X64,并且我想使用预训练模型,例如 VGG16COCO 或任何其他。但问题是预训练模型的输入图像大小为224X224。我如何对这个问题进行排序。输入图像大小是否有任何数据增强方式。

如果我将输入图像的大小调整为224X224,那么图像很可能会变得模糊,这可能会影响训练。如果我错了,请纠正我。

另一个问题与预训练模型有关。如果我使用transfer learning,那么通常我必须从预训练模型中冻结多少层。考虑到我的分类与预训练模型类有很大不同。但我想前几层我们可以冻结它以获得图像的边缘、曲线等,这在所有图像中都很常见。

【问题讨论】:

    标签: machine-learning deep-learning artificial-intelligence conv-neural-network supervised-learning


    【解决方案1】:

    但问题是预训练模型的输入图像大小为 224X224。

    我假设您使用 Keras/Tensorflow(其他 DL 框架也是如此)。根据Keras Application 中的文档:

    input_shape:可选形状元组,仅在 include_top 时指定 为 False (否则输入形状必须为 (224, 224, 3) (使用 'channels_last' 数据格式)或 (3, 224, 224) (使用 'channels_first' 数据格式)。它应该正好有 3 个输入通道,宽度和 高度不应小于 48。例如(200, 200, 3) 将是一个

    所以有两种方法可以解决您的问题:

    1. 将输入图像的大小调整为existing library244*244,并使用VGG分类器[include_top=True]。

    2. 在 VGG 模型之上训练您自己的分类器。如上述Keras 中的文档所述,如果您的图像不是244*244,您应该训练自己的分类器[include_top=False]。您可以通过以下方式轻松完成这些事情:

       inp = keras.layers.Input(shape=(64, 64, 3), name='image_input')
      
       vgg_model = VGG19(weights='imagenet', include_top=False)
       vgg_model.trainable = False
      
       x = keras.layers.Flatten(name='flatten')(vgg_model)
       x = keras.layers.Dense(512, activation='relu', name='fc1')(x)
       x = keras.layers.Dense(512, activation='relu', name='fc2')(x)
       x = keras.layers.Dense(10, activation='softmax', name='predictions')(x)
       new_model = keras.models.Model(inputs=inp, outputs=x)
       new_model.compile(optimizer='adam', loss='categorical_crossentropy', 
                         metrics=['accuracy'])
      

    如果我使用的是迁移学习,那么通常我必须使用多少层 从预训练模型冻结

    这实际上取决于您的新任务、您有多少训练示例、您的预训练模型是什么以及许多其他事情。如果我是你,我会先扔掉预训练的模型分类器。然后,如果不行,就去掉一些其他的卷积层,一步一步做,直到我得到好的性能。

    【讨论】:

    • 1) 调整图像大小可能会丢失图像的特征。如果我错了,请纠正我。
    • 2)对不起,我是深度学习的新手。2 行以下是什么意思?所以我们没有使用 VGG 模型的顶层。然后,您能否解释一下 VGG 模型如何影响您在上面定义的层。 vgg_model = VGG19(weights='imagenet', include_top=False) vgg_model.trainable = False
    • @PankajKumar 将图像从 64 更改为 244 是有风险的,因为您可能会丢失一些功能。在这两行中,首先我加载预训练模型(VGG)并冻结模型(它不可训练)。您只训练了分类器而不是整个模型。
    • 你好,我也有同样的问题,你解决了吗?例如我对 64*64 像素的图像进行了预训练权重。我想对分辨率为 128*128 像素的新图像进行迁移学习。我怎样才能做到这一点?与2)类似的方式?空间大小呢?
    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2017-08-19
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多