VGG模型实现“猫狗大战挑战赛”

本文介绍如何在Kaggle的猫狗识别挑战中应用VGG模型进行优化。通过在Colab上利用免费GPU,下载并预处理数据,然后对预训练的VGG模型进行调整,只训练最后一层以区分猫和狗。使用Adam优化器进行训练,并讨论了训练集大小和迭代次数对模型精度的影响。
摘要由CSDN通过智能技术生成

1 大赛简介

2013年,Kaggle举办过一个很受欢迎的猫狗识别竞赛(Dogs vs. Cats),比赛内容是识别图像中的是猫还是狗。

其中AI研习社平台的猫狗大战赛可以每天提交测试结果,挑战赛内容以及数据集都在此

本博客是基于 github 上 summitgao 老师所编写的建立的VGG模型基础上进行优化改进,并对关键部分进行解读。

2 运行环境及准备

谷歌的 Colab 平台提供免费的云端 GPU ,本篇博客的代码均在Colab上运行。

2.1 数据下载

  • 如下Shell获取数据集并解压在Google云端
!wget http://fenggao-image.stor.sinaapp.com/dogscats.zip
!unzip dogscats.zip

!wget https://static.leiphone.com/cat_dog.rar
!unrar x /content/cat_dog.rar
  • zip文件为 summitgao 老师制作的新的数据集,训练集包含1800张图。
  • rar文件为大赛原数据集,训练集包含20000张图。

cat_dog数据集目录:
cat_dog数据集

  • test:最后通过训练好的模型来识别的测试图片。
  • train:用来训练模型的图片。
  • val:文件夹下的图片有确定的标签,用来测试模型训练效果。
  • dogscats 数据集同理

由于代码需要在 Colab 上运行,速度会相对较慢。因此,本次使用 dogscats 数据集进行训练。

2.2 引入Pytorch包及启用GPU模式

  • 启用GPU:
    在 Colab 编辑器界面:修改—笔记本设置—硬件加速器—GPU
import numpy as np
import matplotlib.pyplot as plt
import os
import torch
import torch.nn as nn
import torchvision
from torchvision import models,transforms,datasets
import time
import json

# 判断是否存在GPU设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('Using gpu: %s ' % torch.cuda.is_available())

2.3 数据预处理

  • 完成数据集的准备后,需要对数据进行一些预处理:
  1. 图片将被整理成 224 × 224 × 3 的大小,同时还将进行归一化处理。
  2. 其他的一些对数据的复杂的预处理/变换 (normalization, cropping, flipping, jittering 等)可以参照 torchvision.tranforms 的官方文档说明。
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])

vgg_format = transforms.Compose([
                transforms.CenterCrop(224),
                transforms.ToTensor(),
                normalize,
            ])

data_dir = '/content/dogscats'

dsets = {
   x: datasets.ImageFolder(os.path.join(data_dir, x), vgg_format)
         for x in ['train', 'valid']}

dset_sizes = {
   x: len(dsets[x]) for x in ['train', 'valid']}
dset_classes = dsets
好的,实现识别任务需要进行迁移学习,使用预训练的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]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值