用CNN实现猫狗识别

目录

前言

我的环境

Step1.准备数据

(1)首先导入必要的包

(2)数据集介绍

 (3) train_reader和test_reader

(4)数据集下载

Step2.网络配置

(1)网络搭建

(2)定义数据

(3)获取分类器

(4)定义损失函数和准确率

(5)定义优化方法

Step3.模型训练 and Step4.模型评估

(1)创建Executor

(2)定义数据映射器

(3)定义绘制训练过程的损失值和准确率变化趋势的方法draw_train_process

(4)训练并保存模型

Step5.模型预测

(1)创建预测用的Executor

(2) 图片预处理

(3)开始预测


前言

        猫狗识别项目说明 本项目旨在利用PaddlePaddle深度学习框架,结合CIFAR10数据集训练和建立猫狗识别模型,并使用外部图片进行检测。 使用的模型为CNN模型。

我的环境

  • 电脑系统:Windows 10
  • 语言环境:Python 3.7
  • 编译器:colab在线编译
  • 深度学习环境:Tensorflow

Step1.准备数据

(1)首先导入必要的包

        paddle.fluid--->PaddlePaddle深度学习框架

        os------------->python的模块,可使用该模块对操作系统进行操作


#导入需要的包
import paddle as paddle
import paddle.fluid as fluid
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import os

(2)数据集介绍

        我们使用CIFAR10数据集。CIFAR10数据集包含60,000张32x32的彩色图片,10个类别,每个类包含6,000张。其中50,000张图片作为训练集,10000张作为验证集。这次我们只对其中的猫和狗两类进行预测。

 (3) train_reader和test_reader

paddle.dataset.cifar.train10()和test10()分别获取cifar训练集和测试集

paddle.reader.shuffle()表示每次缓存BUF_SIZE个数据项,并进行打乱

paddle.batch()表示每BATCH_SIZE组成一个batch

(4)数据集下载

       由于本次实践的数据集稍微比较大,以防出现不好下载的问题,为了提高效率,可以用下面的代码进行数据集的下载。


!mkdir -p /home/aistudio/.cache/paddle/dataset/cifar/

!wget "http://ai-atest.bj.bcebos.com/cifar-10-python.tar.gz" -O cifar-10-python.tar.gz

!mv cifar-10-python.tar.gz /home/aistudio/.cache/paddle/dataset/cifar/
BATCH_SIZE = 128
#用于训练的数据提供器
train_reader = paddle.batch(
    paddle.reader.shuffle(paddle.dataset.cifar.train10(), 
                          buf_size=128*100),           
    batch_size=BATCH_SIZE)                                
#用于测试的数据提供器
test_reader = paddle.batch(
    paddle.dataset.cifar.test10(),                            
    batch_size=BATCH_SIZE)            

Step2.网络配置

(1)网络搭建

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

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

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

def convolutional_neural_network(img):
    # 第一个卷积-池化层
    conv_pool_1 = fluid.nets.simple_img_conv_pool(
        input=img,         # 输入图像
        filter_size=5,     # 滤波器的大小
        num_filters=20,    # filter 的数量。它与输出的通道相同
        pool_size=2,       # 池化核大小2*2
        pool_stride=2,     # 池化步长
        act="relu")        # 激活类型
    conv_pool_1 = fluid.layers.batch_norm(conv_pool_1)
    # 第二个卷积-池化层
    conv_pool_2 = fluid.nets.simple_img_conv_pool(
        input=conv_pool_1,
        filter_size=5,
        num
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的猫狗识别CNN代码实现。 首先,导入必要的库和模块: ``` import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout from tensorflow.keras.preprocessing.image import ImageDataGenerator ``` 接着,定义一些超参数和数据处理的参数: ``` # 图像大小为 128x128 像素 img_width, img_height = 128, 128 # 训练和验证集的目录 train_dir = 'train' val_dir = 'val' # 批次大小 batch_size = 32 # 训练数据增强 train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) # 验证数据增强 val_datagen = ImageDataGenerator(rescale=1./255) # 载入训练和验证数据集 train_generator = train_datagen.flow_from_directory( train_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') val_generator = val_datagen.flow_from_directory( val_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') ``` 接着,定义一个简单的CNN模型: ``` # 初始化模型 model = Sequential() # 添加卷积层和池化层 model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(img_width, img_height, 3))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(128, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) # 添加全连接层 model.add(Flatten()) model.add(Dense(128, activation='relu')) # 添加 Dropout 层,减少过拟合 model.add(Dropout(0.5)) # 输出层 model.add(Dense(1, activation='sigmoid')) ``` 然后,编译模型并进行训练: ``` # 编译模型 model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) # 训练模型 model.fit(train_generator, steps_per_epoch=len(train_generator), epochs=50, validation_data=val_generator, validation_steps=len(val_generator)) ``` 最后,评估模型的性能: ``` # 评估模型 test_loss, test_acc = model.evaluate(val_generator, steps=len(val_generator)) print('Test accuracy:', test_acc) ``` 这就是一个简单的猫狗识别CNN代码实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值