预训练模型扩展的 Keras 模型问题

数据挖掘 喀拉斯 计算机视觉 图像预处理 inceptionresnetv2
2022-02-28 10:02:16

我想向 Resnet50 模型添加更多层,我的问题是 - 我需要编译它并在新数据上训练它还是可以直接使用它?它只会给我 Resnet50 结果吗?

这是我正在尝试的:

def base_model():
resnet = resnet50.ResNet50(weights="imagenet", include_top=False)
x = resnet.output
x = Conv2D(128, (3, 3), activation='relu',padding='same')(x)
x = Conv2D(128, (3, 3), activation='relu',padding='same')(x)
x = MaxPooling2D((2, 2), strides=(2, 2))(x)
x = Conv2D(256, (3, 3), activation='relu',padding='same')(x)
x = Conv2D(256, (3, 3), activation='relu',padding='same')(x)
x = MaxPooling2D((2, 2), strides=(2, 2))(x)
x = Conv2D(512, (3, 3), activation='relu',padding='same')(x)
x = Conv2D(512, (3, 3), activation='relu',padding='same')(x)
x = MaxPooling2D((2, 2), strides=(2, 2))(x)
x = GlobalAveragePooling2D()(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.6)(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.6)(x)
x = Lambda(lambda  x_: K.l2_normalize(x,axis=1))(x)
return Model(inputs=resnet.input, outputs=x)

然后像这样使用它:

enhanced_resnet = base_model()
img = image.load_img(file, target_size=(224, 224))
img = image.img_to_array(img)
x = resnet50.preprocess_input(img)
x = np.array([x])
feature = enhanced_resnet.predict(x)

我想要的返回值是图像的特征而不是预测,因为我使用距离方程来判断图像之间的相似性。

2个回答

简短的回答 - 是的。

预训练的 Resnet 模型具有训练的参数(权重和偏差)。当你在它上面添加额外的层时,这些层的参数是随机初始化的。因此,最终模型将给出随机结果。

在新数据集上添加额外层后,您需要训练新模型。你不需要训练所有前面的层,只需要训练其中的几个。

进一步阅读搜索 - 迁移学习。这就是你想要做的。

在迁移学习技术中,如果您要添加新层,请始终确保编译您的模型。

由于您的项目基于查找图像的相似性,我的建议是仅在添加新的 Conv2D 图层后进行展平。大多数流行的架构不包含密集层以防相似。