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

时间:2017-09-01 18:59:44

标签: deep-learning keras

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

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

如果模型纯粹是卷积的,也许您可​​以手动模仿其结构的大小,复制其权重,找出新的输出形状并尝试使用它(这可以通过{{1}}实现,如Matias Valdenegro的答案)。但如果它是一个分类模型,你就会遇到问题,因为它们要么在最后使用密集层,要么最终的卷积层需要以固定大小结束以进行分类。

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

您可以采取的措施来解决这个问题:

  • 填充输入以满足必要的大小:模型必须训练有素,不要对图像中的大黑暗区域发疯,认为它们意味着什么。
  • 将输入划分为图片的较小区域,可能会有一点重叠(以避免将对象切割成两个并使模型无法识别)。然后你正确加入各自的输出。