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