如何在Python中从迁移学习模型提取图像特征向量?
从ResNet迁移学习模型中提取图像特征向量
我正基于ResNet50实现分类模型,知道CNN或迁移学习模型会自动提取特征,想了解如何在Python中从图像数据集提取对应的特征向量。
模型训练代码
# 导入所需依赖库 from tensorflow.keras.applications import ResNet152V2 from tensorflow.keras.layers import MaxPool2D, BatchNormalization, GlobalAveragePooling2D, Dense, Dropout from tensorflow.keras.models import Model from tensorflow.keras.optimizers import Adam import keras from keras.callbacks import EarlyStopping from tensorflow.keras.preprocessing.image import ImageDataGenerator # 加载预训练ResNet152V2,不包含顶层分类器 base_model = ResNet152V2( input_shape = (height, width, 3), include_top=False, weights='imagenet' ) # 搭建顶层分类结构 top_model = base_model.output top_model = GlobalAveragePooling2D()(top_model) top_model = Dense(1072, activation='relu')(top_model) top_model = Dropout(0.6)(top_model) top_model = Dense(256, activation='relu')(top_model) top_model = Dropout(0.6)(top_model) # 输出分类层 prediction = Dense(len(categories), activation='softmax')(top_model) model = Model(inputs=base_model.input, outputs=prediction) # 冻结所有预训练层 for layer in model.layers: layer.trainable=False # 编译模型 model.compile( optimizer = Adam(learning_rate=0.00001), loss='categorical_crossentropy', metrics=['accuracy'] ) # 早停回调防止过拟合 es_callback = keras.callbacks.EarlyStopping(monitor='val_loss', patience=3) # 图像数据增强配置 datagen = ImageDataGenerator(rotation_range= 30, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.3, horizontal_flip=True ) # 启动训练 resnet152v2 = model.fit(datagen.flow(X_train, y_train), validation_data = (X_val, y_val), epochs = 100, callbacks=[es_callback] )
特征提取实现
通过构建特征提取专用模型,可直接从训练好的模型中输出目标特征向量:
# 构建特征提取模型:输入复用原模型输入,输出为倒数第三层(256维ReLU全连接层) extract = Model(model.inputs, model.layers[-3].output) # 对应原模型中top_model = Dense(256, activation='relu')(top_model)的输出 # 对测试集提取特征,X_test形状为(120, 224, 224, 3) features = extract.predict(X_test)
关键说明
- 特征提取的核心是截取训练好的模型到目标特征层:这里选择
model.layers[-3].output,得到的是256维的抽象特征向量,适合后续的分类、检索等任务。 - 输入为
(120, 224, 224, 3)的测试集时,输出的features形状为(120, 256),即每个测试图像对应一个256维特征。 - 如果需要更底层的卷积特征,可选择
base_model.output作为输出,此时得到的是ResNet最后卷积层的特征图(形状为(120,7,7,2048))。
内容的提问来源于stack exchange,提问作者Rezuana Haque
相关产品推荐
相关产品推荐

