【人工智能】ResNet与MobileNet实现猫狗识别

本次实验使用Cifar - 10数据集进行猫狗图片识别。数据准备阶段进行预处理和增强,采用ResNet - 18、ResNet - 101和MobileNetV3三种模型训练,分别尝试不同图片尺寸。训练后进行预测,结果显示模型泛化性好。ResNet101准确率最佳,MobileNetV3存储开销有优势。

1 实验介绍

本次实验所使用的数据集为Cifar-10。该数据集共有60000张彩色图片,按照5:1的比例划分为训练集和测试集,每张图片的尺寸为32 x 32,共包含10大类别,每个类别含有6000张图片。最终进行预测时,只进行猫与狗两类图片的识别。
在这里插入图片描述

2 数据准备

2.1 导入所需要的包

# 
# 导入需要的包
import paddle
import numpy as np
from PIL import Image
import argparse 
import matplotlib.pyplot as plt
import os
import sys 
import pickle
from paddle.vision.transforms import Compose, Resize, RandomVerticalFlip, RandomHorizontalFlip, ColorJitter, RandomRotation, ToTensor, Normalize
from paddle.vision.datasets import Cifar10
import paddle.vision.transforms as T
from paddle.nn import CrossEntropyLoss
from paddle import nn
from paddle import metric as M
from paddle.io import DataLoader, Dataset
from paddle.nn import functional as F
from paddle.optimizer import Adam
from paddle.optimizer.lr import NaturalExpDecay
from paddle.optimizer.lr import PiecewiseDecay
from paddle.optimizer.lr import CosineAnnealingDecay

from paddle.metric import Accuracy
from visualdl import LogWriter
from paddle.vision.models import resnet18  # 也可以选择其他模型
print("本教程基于Paddle的版本号为:"+paddle.__version__)

2.2 数据预处理

创建类别字典,将标签与类别名对应

label_dict = {
   
   
'0':'airplane',
'1':'automobile',
'2':'bird',
'3':'cat',
'4':'deer',
'5':'dog',
'6':'frog',
'7':'horse',
'8':'ship',
'9':'truck'
}

  使用飞桨自带的接口导入Cifar-10数据集,分别定义训练集和测试集的数据处理方式。使用ToTensor 接口对数据进行转换,以匹配数据馈送格式,同时对图像的RGB 三通道分别进行标准化。为提高模型的泛化能力,降低过拟合,还需对训练集进行数据增强,使用到的方法包括随机水平翻转、随机垂直翻转、随机旋转、随机调整图像亮度等。注意到,实验所使用的预训练模型的输入尺寸为32 x 32,在后续的实验中,分别尝试将原始大小的图片与经过尺寸调整后的图片(224x224)导入模型进行训练。

#最开始使用32x32进行训练,后续为了进一步提高准确率,将图像尺寸修改为了224x224
train_transforms = T.Compose([
T.Resize(32),
T.RandomVerticalFlip(),
T.RandomHorizontalFlip(),
T.ColorJitter(0.4, 0.4, 0.4, 0.4),
T.RandomRotation(180),
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
eval_transforms = T.Compose([
T.Resize(32),
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
train_dataset = Cifar10(mode='train', transform=train_transforms)
eval_dataset = Cifar10(mode='test', transform=eval_transforms)

使用如下代码输出数据集的形状和标签

print('=============train_dataset =============')
#输出数据集的形状和标签
print(train_dataset.__getitem__(1)[0].shape,train_dataset.__getitem__(1)[1])
#输出数据集的长度
print(train_dataset.__len__())
print('=============eval_dataset =============')
#输出数据集的形状和标签
for data, label in eval_dataset:
    print(data.shape, label)
    break
#输出数据集的长度
print(eval_dataset.__len__())

得到训练集和测试集的大小:
![[Pasted image 20231228202050.png]]
至此,数据准备工作完成,可以开始进行后续的训练

3 网络配置

3.1 ResNet-18模型

CNN网络模型

  在CNN模型中,卷积神经网络能够更好的利用图像的结构信息。下面定义了一个较简单的卷积神经网络。显示了其结构:输入的二维图像,先经过三次卷积层、池化层和Batchnorm,再经过全连接层,最后使用softmax分类作为输出层。

Image

池化是非线性下采样的一种形式,主要作用是通过减少网络的参数来减小计算量,并且能够在一定程度上控制过拟合。通常在卷积层的后面会加上一个池化层。paddlepaddle池化默认为最大池化。是用不重叠的矩形框将输入层分成不同的区域,对于每个矩形框的数取最大值作为输出

BatchNorm2D顾名思义是对每batch个数据同时做一个norm。作用就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的.

  本实验最初选定resnet18模型,残差神经网络(ResNet)是由微软研究院的何恺明、张祥雨、任少卿、孙剑等人提出的。ResNet 在2015 年的ILSVRC(ImageNet Large Scale Visual Recognition Challenge)中取得了冠军,出自论文Deep Residual Learning for Iage Recognitiono该模型提出了残差学习的思想,改善了深度网络的退化问题,并针对退化现象发明了 “快捷连接(Shortcut connection)”,极大的消除了深度过大的神经网络训练困难问题。

  • ResidualBlock 类: 定义了 ResNet 中的残差块。每个残差块包含两个卷积层和 Batch Normalization 层,以及残差连接。当输入和输出通道数不同时,通过一个额外的卷积层来调整维度。

  • ResNet 类: 定义了整个 ResNet 模型。包含一个输入卷积层和四个阶段(每个阶段包含若干个残差块),最后接全连接层输出分类结果。

  • ResNet18 函数: 返回一个使用 ResNet 残差块构建的 ResNet-18 模型。

from paddle.nn import Conv2D, Sequential, BatchNorm2D, ReLU, Linear
import paddle.nn.functional as F

class ResidualBlock(paddle.nn.Layer
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值