首页 文章

使用Keras中预先训练的CNN输入维度,用于转移学习

提问于
浏览
1

我想尝试使用Keras库中可用的一些预先训练的CNN模型(例如Exception,ResNet50等)进行特征提取 . 我试图找出我的数据集的输入维度是否需要与用于训练原始CNN的图像的维度相匹配 .

例如;我是否应该使用在210x210 RGB图像上预训练的网络模型,这是否意味着如果我想将它用于特征提取,网络将只能使用相同维度的图像(即(210,210,3))?或者在这方面有一些灵活性?

尝试搜索Google并查看Keras文档,但无法找到关于此问题的明确答案!任何有此事的经验的人都会非常感激 .

2 回答

  • 0

    不,这是可能的,您可以更改预训练模型的 input_shape . 它甚至在keras.aplications上提到documentation .

    通过自定义输入张量构建InceptionV3

    from keras.applications.inception_v3 import InceptionV3
    from keras.layers import Input
    
    # this could also be the output a different Keras model or layer
    # this assumes K.image_data_format() == 'channels_last'
    input_tensor = Input(shape=(224, 224, 3))  
    
    model = InceptionV3(input_tensor=input_tensor, weights='imagenet',
                        include_top=False)
    

    请注意,如果要使用尺寸与训练大小不同的模型,则必须将 include_top 设置为 False ,因为模型的完全连接图层仅限于接受具有正确维度的特征,即由生成的特征生成的特征 . 原始训练图像大小 .

  • 3

    是的,没有灵活性 . (但看看Matias Valdenegro的回答)

    Keras模型使用静态定义的维度 .

    例如,改变尺寸意味着改变以下卷积层的所有结果尺寸,并且还改变所有密集层的权重量 . (那么,如何处理新的或缺失的权重?它们会影响计算)

    如果一个模型纯粹是卷积的,也许您可以手动模仿其结构的大小,复制其权重,找出新的输出形状并尝试使用它(这可以通过 include_top=False 实现,如Matias Valdenegro 's answer). But if it' sa分类模型,你会有一个问题,因为他们要么在最后使用密集的层,要么他们的最终卷积层需要以固定的大小结束以进行分类 .

    但即使在纯卷积的情况下,如果模型没有经过图像中各种不同大小和对象位置的训练,它就会失去识别事物的能力,因为它的卷积滤波器正在搜索固定大小的特征 . 像素 .


    你可以做的解决这个问题的方法是:

    • 填充输入以满足必要的大小:模型必须训练有素,不要对图像中的大黑暗区域发疯,认为它们意味着什么 .

    • 将输入划分为图片的较小区域,可能会有一点重叠(以避免将对象切割成两个并使模型无法识别) . 然后正确加入相应的输出 .

相关问题