我想尝试使用Keras库中可用的一些预先训练的CNN模型(例如Exception,ResNet50等)进行特征提取 . 我试图找出我的数据集的输入维度是否需要与用于训练原始CNN的图像的维度相匹配 .
例如;我是否应该使用在210x210 RGB图像上预训练的网络模型,这是否意味着如果我想将它用于特征提取,网络将只能使用相同维度的图像(即(210,210,3))?或者在这方面有一些灵活性?
尝试搜索Google并查看Keras文档,但无法找到关于此问题的明确答案!任何有此事的经验的人都会非常感激 .
2 回答
不,这是可能的,您可以更改预训练模型的
input_shape
. 它甚至在keras.aplications上提到documentation .通过自定义输入张量构建InceptionV3
请注意,如果要使用尺寸与训练大小不同的模型,则必须将
include_top
设置为False
,因为模型的完全连接图层仅限于接受具有正确维度的特征,即由生成的特征生成的特征 . 原始训练图像大小 .是的,没有灵活性 . (但看看Matias Valdenegro的回答)
Keras模型使用静态定义的维度 .
例如,改变尺寸意味着改变以下卷积层的所有结果尺寸,并且还改变所有密集层的权重量 . (那么,如何处理新的或缺失的权重?它们会影响计算)
如果一个模型纯粹是卷积的,也许您可以手动模仿其结构的大小,复制其权重,找出新的输出形状并尝试使用它(这可以通过
include_top=False
实现,如Matias Valdenegro 's answer). But if it' sa分类模型,你会有一个问题,因为他们要么在最后使用密集的层,要么他们的最终卷积层需要以固定的大小结束以进行分类 .但即使在纯卷积的情况下,如果模型没有经过图像中各种不同大小和对象位置的训练,它就会失去识别事物的能力,因为它的卷积滤波器正在搜索固定大小的特征 . 像素 .
你可以做的解决这个问题的方法是:
填充输入以满足必要的大小:模型必须训练有素,不要对图像中的大黑暗区域发疯,认为它们意味着什么 .
将输入划分为图片的较小区域,可能会有一点重叠(以避免将对象切割成两个并使模型无法识别) . 然后正确加入相应的输出 .