使用具有不同输入形状和类模型的预训练模型

时间:2018-09-01 18:02:08

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

我正在使用CNN处理分类问题,其中输入图像大小为64X64,并且我想使用诸如 VGG16 COCO < / em>或任何其他。但是问题是预训练模型的输入图像大小为224X224。如何解决此问题。输入图像大小是否有任何数据扩充方法。

如果我将输入图像的尺寸调整为224X224,则图像出现模糊的可能性很大,这可能会影响训练。如果我错了,请纠正我。

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

1 个答案:

答案 0 :(得分:4)

  

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

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

  

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

因此,有两种方法可以解决您的问题:

1)通过Keras Application将输入图像的大小调整为244*244,并使用 VGG 分类器[include=true]。

2)在VGG模型之上训练自己的分类器。如上述Keras中的文档所述,如果您的图像不同于244 * 244,则应训练自己的分类器[include=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'])
  

如果我正在使用转移学习,那么通常我必须如何分层   从预先训练的模型中冻结

这实际上取决于您的新任务,您拥有多少培训示例,您的预训练模型是什么以及许多其他事情。如果我是您,那么我首先会丢弃预训练的模型分类器。然后,如果不起作用,请删除其他一些卷积层,并逐步进行操作,直到获得良好的性能为止。