You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:50:26