用Python编写的VGG16模型的微调示例代码
发布时间:2023-12-15 18:18:29
下面是使用Python编写的VGG16模型微调的示例代码:
import tensorflow as tf
from tensorflow.keras.applications import VGG16
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
# 加载预训练的VGG16模型
vgg_base = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# 冻结VGG16的所有层,只训练自定义的全连接层
for layer in vgg_base.layers:
layer.trainable = False
# 添加自定义的全连接层
x = vgg_base.output
x = GlobalAveragePooling2D()(x) # 添加全局平均池化层
x = Dense(256, activation='relu')(x) # 添加全连接层
predictions = Dense(10, activation='softmax')(x) # 添加分类层,假设有10个类别
# 定义微调模型
model = Model(inputs=vgg_base.input, outputs=predictions)
# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 加载数据并进行预处理
# ...
# 假设加载的数据存储在train_data和train_labels中
# 进行模型训练
model.fit(train_data, train_labels, epochs=10, batch_size=32)
# 保存模型
model.save('vgg16_finetuned.h5')
上述代码中,我们首先加载了预训练的VGG16模型,然后冻结了VGG16的所有层,只让自定义的全连接层参与训练。接下来,我们为全连接层添加了全局平均池化层和一个具有256个神经元的全连接层,最后通过一个具有10个神经元的softmax层进行分类。
在完成模型搭建后,我们使用compile函数来编译模型,定义优化器、损失函数和评估指标。
接下来,我们需要加载数据并进行预处理。这里的数据预处理部分需要根据具体的数据集进行编写,包括数据加载、图像预处理等操作。
最后,我们使用fit函数来进行模型训练,指定训练的轮数和批次大小。训练完成后,可以使用save函数保存微调后的模型。
下面是一个使用示例:
# 加载VGG16模型并进行微调
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications.vgg16 import preprocess_input
# 数据路径
train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
img_width, img_height = 224, 224
batch_size = 32
num_epochs = 10
# 创建ImageDataGenerator对象来进行数据预处理和增强
train_datagen = ImageDataGenerator(
preprocessing_function=preprocess_input,
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
validation_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)
# 加载训练数据集
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical')
# 加载验证数据集
validation_generator = validation_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical')
# 加载模型进行微调
model = tf.keras.applications.VGG16(weights='imagenet', include_top=False, input_shape=(img_width, img_height, 3))
for layer in model.layers:
layer.trainable = False
x = model.output
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x = tf.keras.layers.Dense(256, activation='relu')(x)
predictions = tf.keras.layers.Dense(train_generator.num_classes, activation='softmax')(x)
fine_tuned_model = tf.keras.models.Model(inputs=model.input, outputs=predictions)
fine_tuned_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
fine_tuned_model.fit(
train_generator,
epochs=num_epochs,
validation_data=validation_generator)
以上代码中根据数据集的路径指定训练数据和验证数据的路径,然后使用ImageDataGenerator来进行数据预处理和增强。ImageDataGenerator是一个用于图像处理的实用工具,可以通过给定的参数对图像进行各种变换和增强操作。然后,我们使用flow_from_directory方法加载训练和验证数据集。在加载完数据后,我们使用VGG16模型进行微调,然后使用fit函数进行模型训练。
注意:上述示例代码仅为示例用途,具体的数据加载和预处理过程需要根据实际数据集进行适当的修改。
