简介:本文介绍了如何在TensorFlow2中使用迁移学习技术,基于预训练的ResNet-101模型对花卉图像进行精准分类。通过调整预训练模型的部分层,并加入自定义层,我们可以在较少的数据集上实现高效的训练和高精度的分类。
随着深度学习的普及,图像分类成为计算机视觉领域的基础任务之一。然而,从头开始训练一个大型深度神经网络往往需要海量的数据和强大的计算资源。迁移学习则提供了一种高效利用已有模型的方法,通过在预训练模型的基础上进行微调,从而实现对新任务的快速适应。
在本文中,我们将利用TensorFlow2和迁移学习技术,使用预训练的ResNet-101模型来构建一个花卉图像分类器。ResNet(残差网络)因其优秀的性能和泛化能力在图像识别领域得到了广泛应用。
首先,确保你的开发环境中已经安装了TensorFlow2。此外,我们还需要准备花卉数据集,这里我们使用一个包含5类花卉(雏菊、蒲公英、玫瑰、向日葵、郁金香)的数据集,共计3670张图片。
数据集下载与预处理:
预训练模型下载:
接下来,我们将详细介绍如何使用TensorFlow2来实现迁移学习。
import tensorflow as tffrom tensorflow.keras.applications.resnet import ResNet101from tensorflow.keras.layers import Flatten, Dense, Dropoutfrom tensorflow.keras.models import Modelfrom tensorflow.keras.optimizers import Adamfrom tensorflow.keras.preprocessing.image import ImageDataGenerator
# 加载预训练模型,不包括顶层的全连接层pre_trained_model = ResNet101(input_shape=(224, 224, 3), include_top=False, weights='imagenet')
由于我们是在小数据集上进行训练,我们可以选择冻结大部分预训练层的权重,只训练新添加的全连接层。
for layer in pre_trained_model.layers:layer.trainable = False
# 添加Flatten层x = Flatten()(pre_trained_model.output)# 添加全连接层x = Dense(1024, activation='relu')(x)x = Dropout(0.5)(x)x = Dense(5, activation='softmax')(x) # 5个类别的输出# 创建新模型model = Model(inputs=pre_trained_model.input, outputs=x)
model.compile(optimizer=Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])
为了提高模型的泛化能力,我们使用数据增强技术。
```python
train_datagen = ImageDataGenerator(rescale=1./255., rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
validation_datagen = ImageDataGenerator(rescale=1./255.)
train_generator = train_datagen.flow_from_directory(‘path_to_train_dir’, target_size=(224, 224), batch_size=32, class_mode=’categorical’)
validation_generator = validation_datagen.flow_from_directory(‘path_to_validation_dir’, target_size=(224, 224), batch