Deep learning 在Keras中使用预训练CNN输入维度进行迁移学习

Deep learning 在Keras中使用预训练CNN输入维度进行迁移学习,deep-learning,keras,Deep Learning,Keras,我想尝试使用Keras库提供的一些预先训练好的CNN模型(例如Exception、ResNet50等)进行特征提取。我试图找出我的数据集的输入维度是否需要与用于训练原始CNN的图像的维度相匹配 比如,;我是否应该使用在210x210 RGB图像上预先训练过的网络模型,这是否意味着如果我想使用它进行特征提取,网络将只处理相同维度的图像(即(210,210,3))?还是在这方面有一些灵活性 尝试搜索Google并查看Keras文档,但是找不到关于这个问题的明确答案!非常感谢在这方面有经验的人的任何意

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

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


尝试搜索Google并查看Keras文档,但是找不到关于这个问题的明确答案!非常感谢在这方面有经验的人的任何意见。

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

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

例如,更改维度意味着更改以下卷积层的所有结果维度,以及更改所有密集层的权重量。(那么,如何处理新的或丢失的权重?它们将影响计算)

如果一个模型是纯卷积的,也许你可以用不同的尺寸手动模拟它的结构,复制它的权重,计算出新的输出形状并尝试使用它(这可以通过
include_top=False
实现,就像Matias Valdenegro的回答一样)。但是如果是一个分类模型,你会遇到一个问题,因为要么它们在最后使用密集层,要么它们的最终卷积层需要以固定的大小结束分类

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


您可以采取以下措施来解决此问题:

  • 填充输入以满足必要的大小:模型必须经过良好的训练,不要对图像中巨大的黑暗区域发狂,以为它们意味着什么
  • 将输入划分在图片的较小区域,可能有一点重叠(以避免将对象一分为二,然后使模型无法识别)。然后正确地连接各个输出

不,这是可能的,您可以更改预训练模型的
输入形状。甚至在keras.aplications中也提到了这一点

在自定义输入张量上构建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
,因为模型的完全连接层仅限于接受具有正确维度的特征,由原始训练图像大小生成的图像。

我想你指的是《盗梦空间》,不例外。或者可能是例外。有趣的答案——我看到
include\u top=False
使这些模型完全卷积(去掉最后的密集层)。