欢迎访问宙启技术站
智能推送

使用Keras和ResNet50实现图像分类任务的实时数据增强

发布时间:2023-12-24 07:17:54

Keras是一个基于Python的开源神经网络库,而ResNet50是一个深度卷积神经网络模型,适用于图像分类任务。数据增强是指对训练集进行随机转换、旋转、缩放等操作,以增加训练数据的变化性,提高模型的鲁棒性和泛化能力。

以下是使用Keras和ResNet50实现图像分类任务的实时数据增强的代码示例:

import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.applications.resnet50 import ResNet50, preprocess_input
from keras.layers import Dense, GlobalAveragePooling2D
from keras.models import Model
from keras.optimizers import SGD

# 设置随机数种子,确保结果可重复性
np.random.seed(42)

# 设置数据路径和参数
train_data_dir = 'path_to_train_data_directory'
validation_data_dir = 'path_to_validation_data_directory'
img_width, img_height = 224, 224
batch_size = 32
epochs = 10

# 定义数据增强生成器
train_datagen = ImageDataGenerator(
    preprocessing_function=preprocess_input,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

test_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='categorical')

# 加载预训练的ResNet50模型,不包括顶部的全连接层
base_model = ResNet50(weights='imagenet', include_top=False)

# 添加全局平均池化层
x = base_model.output
x = GlobalAveragePooling2D()(x)

# 添加全连接层
x = Dense(1024, activation='relu')(x)
predictions = Dense(train_generator.num_classes, activation='softmax')(x)

# 构建完整的模型
model = Model(inputs=base_model.input, outputs=predictions)

# 冻结ResNet50的所有卷积层,只训练顶部的全连接层
for layer in base_model.layers:
    layer.trainable = False

# 编译模型
model.compile(optimizer=SGD(lr=0.001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])

# 训练模型
model.fit_generator(
    train_generator,
    steps_per_epoch=train_generator.samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=validation_generator.samples // batch_size)

# 解冻ResNet50的前几层,继续训练模型
for layer in model.layers[:165]:
    layer.trainable = False

for layer in model.layers[165:]:
    layer.trainable = True

model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])

model.fit_generator(
    train_generator,
    steps_per_epoch=train_generator.samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=validation_generator.samples // batch_size)

以上代码实现了基于Keras和ResNet50的图像分类任务的实时数据增强。首先,定义了训练集和验证集的ImageGenerator,并设置了一些数据增强参数,如随机剪切、缩放和水平翻转等。

然后,加载预训练的ResNet50模型,并构建了一个完整的模型,包括全局平均池化层和全连接层。接着,冻结了ResNet50的所有卷积层,只训练顶部的全连接层。

模型编译后,使用fit_generator函数进行训练。训练完冻结的顶部全连接层后,解冻了ResNet50的前几层,继续训练整个模型。

通过以上步骤,我们可以实现基于Keras和ResNet50的图像分类任务的实时数据增强。这样的数据增强可以提高模型的泛化能力,并减少过拟合的可能性。