迁移学习使用vgg16模型实现猫狗识别
时间: 2023-11-21 13:06:50 浏览: 133
猫狗数据集的二分类图像识别项目:基于VGG16网络的迁移学习
好的,实现猫狗识别任务需要进行迁移学习,使用预训练的VGG16模型可以帮助我们快速搭建一个高效的卷积神经网络。
以下是基本的实现步骤:
1. 导入相关库
```python
import os
import numpy as np
from keras.preprocessing.image import load_img, img_to_array
from keras.applications.vgg16 import VGG16, preprocess_input
from keras.models import Model
from keras.layers import Dense, Dropout, Flatten
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split
```
2. 加载数据集
我们使用的数据集是Kaggle上的猫狗分类数据集,可以从以下链接下载:https://www.kaggle.com/c/dogs-vs-cats/data
数据集中包含25,000张大小不一的猫和狗的图片,我们需要将其转换为模型可以处理的格式。
```python
# 定义数据集根目录
data_dir = 'path/to/data'
# 定义图片大小和批次大小
img_size = (224, 224)
batch_size = 32
# 加载数据集并将其转换为模型可以处理的格式
def load_dataset():
X = []
Y = []
for file in os.listdir(data_dir):
if file.endswith('.jpg'):
img = load_img(os.path.join(data_dir, file), target_size=img_size)
img = img_to_array(img)
X.append(img)
if 'cat' in file:
Y.append(0)
else:
Y.append(1)
return np.array(X), np.array(Y)
X, Y = load_dataset()
```
3. 划分数据集
我们将数据集划分为训练集、验证集和测试集。训练集用于训练模型,验证集用于调整模型参数,测试集用于评估模型性能。
```python
# 划分数据集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
X_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size=0.2, random_state=42)
```
4. 加载预训练模型
我们使用Keras中已经训练好的VGG16模型作为特征提取器,将其载入并输出模型结构。
```python
# 加载预训练模型
base_model = VGG16(include_top=False, weights='imagenet', input_shape=img_size+(3,))
# 输出模型结构
for layer in base_model.layers:
print(layer.name, layer.input_shape, layer.output_shape)
```
5. 冻结模型权重
我们将模型的卷积层权重冻结,只训练新添加的全连接层的权重。
```python
# 冻结模型权重
for layer in base_model.layers:
layer.trainable = False
```
6. 构建模型
我们在VGG16模型的顶部添加了几个全连接层,用于分类任务。
```python
# 添加新的全连接层
x = base_model.output
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(1, activation='sigmoid')(x)
# 构建新模型
model = Model(inputs=base_model.input, outputs=x)
# 输出模型结构
model.summary()
```
7. 训练模型
我们使用Adam优化器和二元交叉熵损失函数训练模型。
```python
# 编译模型
model.compile(optimizer=Adam(lr=0.001), loss='binary_crossentropy', metrics=['accuracy'])
# 训练模型
history = model.fit(
preprocess_input(X_train), Y_train,
batch_size=batch_size, epochs=10,
validation_data=(preprocess_input(X_val), Y_val),
verbose=1
)
```
8. 评估模型
我们使用测试集评估模型性能。
```python
# 评估模型
score = model.evaluate(preprocess_input(X_test), Y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
```
阅读全文