我想尝试使用Keras库提供的一些预先训练的CNN模型(例如Exception,ResNet50等)进行特征提取。我试图找出我的数据集的输入维度是否需要与用于训练原始CNN的图像的维度相匹配。
例如;我是否应该使用在210x210 RGB图像上预训练的网络模型,这是否意味着网络只能用于相同维度的图像(即(210,210,3)),如果我想用它进行特征提取?或者在这方面有一些灵活性吗?
尝试搜索Google并查看Keras文档,但无法找到有关此问题的明确答案!任何有此事的经验的人都会非常感激。
答案 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的答案)。但如果它是一个分类模型,你就会遇到问题,因为它们要么在最后使用密集层,要么最终的卷积层需要以固定大小结束以进行分类。
但即使在纯卷积的情况下,如果模型没有经过图像中各种不同大小和对象位置的训练,它就会失去识别事物的能力,因为它的卷积滤波器正在搜索固定大小的像素。
您可以采取的措施来解决这个问题: