2017-09-01 68 views
-1

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

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

尝试搜索Google并检查Keras文档,但无法找到有关此问题的明确答案!任何有经验的人在这个问题上的任何意见将不胜感激。

+0

我认为你的意思是启动,而不是例外。或者也许Xception。 –

回答

2

不,这是可能的,你可以更改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_topFalse,作为完全连接层该模型仅受限于接受具有正确维度的特征,即由原始训练图像大小生成的特征。

+0

有趣的答案 - 我看到'include_top = False'使得这些模型完全卷积(去除最后的密集层)。 –

0

是的,没有灵活性。 (但看看马蒂亚斯Valdenegro的答案)

Keras模型工作与一个静态定义的维度。

更改尺寸意味着更改以下卷积图层的所有最终尺寸,并且还会更改所有密集图层的权重量。 (所以,如何处理新的或缺失的权重?他们将影响计算)

如果一个模型纯粹是卷积的,也许你可以手动模仿其结构的大小,复制它的权重,找出新的输出形状并尝试使用它(这可以通过include_top=False来实现,如Matias Valdenegro的答案)。但是如果它是一个分类模型,你会遇到问题,因为他们最后使用密集层,或者他们的最终卷积层需要以固定的大小结束分类。但即使在纯粹的卷积情况下,如果模型没有被训练成图像中各种不同大小和位置的物体,它可能会失去识别物体的能力,因为卷积滤波器正在寻找特征一个固定的像素大小。


事情可以做,以解决此问题是:

  • 填充的投入,以满足必要的尺寸:该模式必须训练有素不要去疯狂的巨大黑暗区域的图像认为他们的意思是什么
  • 将输入分为图片的较小区域,可能会有一些重叠(以避免将对象切割成两部分,然后使模型无法识别)。然后,您可以正确加入相应的输出。
相关问题