首页 > 其他分享 >人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类

时间:2024-01-29 14:32:27浏览次数:20  
标签:CIFAR10 fluid paddle batch 飞桨 train test pool

猫狗分类

一、实验背景

图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题。猫狗分类属于图像分类中的粗粒度分类问题。

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_CNN

(1)数据集介绍

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

(2)train_reader和test_reader;

自定义读取器处理训练集和测试集;

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

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

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_人工智能_02

二、实验内容:

对数据集中的猫狗图像进行正确分类,并不断调整模型。

三、实验步骤及结果

1.导入库以及数据

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_人工智能_03

2.准备数据

解压数据集;

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_CIFAR10_04

定义数据序列化函数;

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_猫狗分类_05

      自定义数据集;

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_CNN_06

输出数据集的形状和标签

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_paddle_07

输出数据集的长度

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_CNN_08

3. 网络配置

CNN网络模型:

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

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_CIFAR10_09

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

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

4. 模型训练及模型评估

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_paddle_10

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_人工智能_11

5. 模型预测

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_CNN_12

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_CIFAR10_13

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_paddle_14

四、实验结果及分析

从训练结果也可以看出,accuracy 只有 0.6,loss 也很大,这对于模型预测的准确率是不够的。同时我们也可以从实际的预测中看出这个结果:模型将狗识别成了猫。

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_CNN_15

所以我们需要对模型进行改进和优化。

优化代码

代码如下:

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

'''#解压数据集
!tar -zxvf /home/aistudio/data/data9154/cifar-10-python.tar.gz
'''
!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/

!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/
!ls -a /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)                                
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_filters=50,
        pool_size=2,
        pool_stride=2,
        act="relu")
    conv_pool_2 = fluid.layers.batch_norm(conv_pool_2)
    # 第三个卷积-池化层
    conv_pool_3 = fluid.nets.simple_img_conv_pool(
        input=conv_pool_2,
        filter_size=5,
        num_filters=50,
        pool_size=2,
        pool_stride=2,
        act="relu")
    # 以softmax为激活函数的全连接输出层,10类数据输出10个数字
    prediction = fluid.layers.fc(input=conv_pool_3, size=10, act='softmax')
    return prediction
#定义输入数据
paddle.enable_static()
data_shape = [3, 32, 32]
images = fluid.layers.data(name='images', shape=data_shape, dtype='float32')
label = fluid.layers.data(name='label', shape=[1], dtype='int64')

# 获取分类器,用cnn进行分类
predict =  convolutional_neural_network(images)

# 获取损失函数和准确率
cost = fluid.layers.cross_entropy(input=predict, label=label) # 交叉熵
avg_cost = fluid.layers.mean(cost)                            # 计算cost中所有元素的平均值
acc = fluid.layers.accuracy(input=predict, label=label)       #使用输入和标签计算准确率

# 获取测试程序
test_program = fluid.default_main_program().clone(for_test=True)
 
# 定义优化方法
optimizer =fluid.optimizer.Adam(learning_rate=0.001)
optimizer.minimize(avg_cost)
print("完成")
###创建Executor
# 定义使用CPU还是GPU,使用CPU时use_cuda = False,使用GPU时use_cuda = True
use_cuda = True
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()

# 创建执行器,初始化参数
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())

###定义数据映射器
 
feeder = fluid.DataFeeder( feed_list=[images, label],place=place)

###3)定义绘制训练过程的损失值和准确率变化趋势的方法draw_train_process
all_train_iter=0
all_train_iters=[]
all_train_costs=[]
all_train_accs=[]
 
def draw_train_process(title,iters,costs,accs,label_cost,lable_acc):
    plt.title(title, fontsize=24)
    plt.xlabel("iter", fontsize=20)
    plt.ylabel("cost/acc", fontsize=20)
    plt.plot(iters, costs,color='red',label=label_cost) 
    plt.plot(iters, accs,color='green',label=lable_acc) 
    plt.legend()
    plt.grid()
    plt.show()
###训练并保存模型

EPOCH_NUM = 20
model_save_dir = "/home/aistudio/work/catdog.inference.model"
 
for pass_id in range(EPOCH_NUM):
    # 开始训练
    for batch_id, data in enumerate(train_reader()):                        #遍历train_reader的迭代器,并为数据加上索引batch_id
        train_cost,train_acc = exe.run(program=fluid.default_main_program(),#运行主程序
                             feed=feeder.feed(data),                        #喂入一个batch的数据
                             fetch_list=[avg_cost, acc])                    #fetch均方误差和准确率
 
        
        all_train_iter=all_train_iter+BATCH_SIZE
        all_train_iters.append(all_train_iter)
        all_train_costs.append(train_cost[0])
        all_train_accs.append(train_acc[0])
        
        #每100次batch打印一次训练、进行一次测试
        if batch_id % 100 == 0:                                             
            print('Pass:%d, Batch:%d, Cost:%0.5f, Accuracy:%0.5f' % 
            (pass_id, batch_id, train_cost[0], train_acc[0]))
            
 
    # 开始测试
    test_costs = []                             #测试的损失值
    test_accs = []                                            #测试的准确率
    for batch_id, data in enumerate(test_reader()):
        test_cost, test_acc = exe.run(program=test_program,       #执行测试程序
                                      feed=feeder.feed(data),          #喂入数据
                                      fetch_list=[avg_cost, acc])     #fetch 误差、准确率
        test_costs.append(test_cost[0])                       #记录每个batch的误差
        test_accs.append(test_acc[0])                       #记录每个batch的准确率

    # 求测试结果的平均值
    test_cost = (sum(test_costs) / len(test_costs))     #计算误差平均值(误差和/误差的个数)
    test_acc = (sum(test_accs) / len(test_accs))    #计算准确率平均值( 准确率的和/准确率的个数)
    print('Test:%d, Cost:%0.5f, ACC:%0.5f' % (pass_id, test_cost, test_acc))
    
#保存模型
# 如果保存路径不存在就创建
if not os.path.exists(model_save_dir):
    os.makedirs(model_save_dir)
print ('save models to %s' % (model_save_dir))
fluid.io.save_inference_model(model_save_dir,
                              ['images'],
                              [predict],
                              exe)
print('训练模型保存完成!')
draw_train_process("training",all_train_iters,all_train_costs,all_train_accs,"trainning cost","trainning acc")
###模型预测

#(1)创建预测用的Executor
infer_exe = fluid.Executor(place)
inference_scope = fluid.core.Scope() 

#(2)图片预处理
def load_image(file):
        #打开图片
        im = Image.open(file)
        #将图片调整为跟训练数据一样的大小  32*32,                   设定ANTIALIAS,即抗锯齿.resize是缩放
        im = im.resize((32, 32), Image.ANTIALIAS)
        #建立图片矩阵 类型为float32
        im = np.array(im).astype(np.float32)
        #矩阵转置 
        im = im.transpose((2, 0, 1))                               
        #将像素值从【0-255】转换为【0-1】
        im = im / 255.0
        #print(im)       
        im = np.expand_dims(im, axis=0)
        # 保持和之前输入image维度一致
        print('im_shape的维度:',im.shape)
        return im

#(3)开始预测
with fluid.scope_guard(inference_scope):
    #从指定目录中加载 推理model(inference model)
    [inference_program, # 预测用的program
     feed_target_names, # 是一个str列表,它包含需要在推理 Program 中提供数据的变量的名称。 
     fetch_targets] = fluid.io.load_inference_model(model_save_dir,#fetch_targets:是一个 Variable 列表,从中我们可以得到推断结果。
                                                    infer_exe)     #infer_exe: 运行 inference model的 executor
    
    infer_path='/home/aistudio/data/data7940/dog.png'
    img = Image.open(infer_path)
    plt.imshow(img)   
    plt.show()    
    
    img = load_image(infer_path)
 
    results = infer_exe.run(inference_program,                 #运行预测程序
                            feed={feed_target_names[0]: img},  #喂入要预测的img
                            fetch_list=fetch_targets)          #得到推测结果
    print('results',results)
    label_list = [
        "airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse",
        "ship", "truck"
        ]
    print("infer results: %s" % label_list[np.argmax(results[0])])

当修改了CNN网络模型我们可以看到:

迭代次数epochs

批处理大小batch_size

学习率learning_rate

20

128

0.001

准确率达到0.89844;并且准确的识别狗成功;

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_猫狗分类_16

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_CNN_17

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_人工智能_18

当迭代次数变为50时,准确率可高达0.98438,并且准确的识别狗成功;

迭代次数epochs

批处理大小batch_size

学习率learning_rate

50

128

0.001

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_猫狗分类_19

人工智能||百度飞桨paddle paddle——CIFAR10数据集CNN实现猫狗分类_人工智能_20

至此,实验完成。

标签:CIFAR10,fluid,paddle,batch,飞桨,train,test,pool
From: https://blog.51cto.com/u_16532251/9465010

相关文章

  • 卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类
    原文链接:https://blog.csdn.net/master_hunter/article/details/133156758卷积神经网络相对于普通神经网络在于以下四个特点:局部感知域:CNN的神经元只与输入数据的一小部分区域相连接,这使得CNN对数据的局部结构具有强大的敏感性,可以自动学习到图像的特征。参数共享:在CNN中,同一个......
  • 有挑战才有收获!PaddleOCR算法模型挑战赛火热开启!
    在数字化时代,文本和表格识别在生活和工作中扮演着越来越重要的角色。从扫描件、图片中的文字提取,到自动化录入数据、分析报表,这些场景都需要高效准确的文本识别和表格识别技术。作为PaddleOCR开源项目背后的维护者,飞桨团队一直致力于提升光学字符识别(Opticalcharacterrecognition......
  • 全流程机器视觉工程开发(一)环境准备,paddledetection和labelme
    前言我现在在准备做一个全流程的机器视觉的工程,之前做了很多理论相关的工作。大概理解了机器视觉的原理,然后大概了解了一下,我发现现在的库其实已经很发展了,完全不需要用到非常多的理论,只需要知道开发过程就可以了,甚至paddlex已经直接有了傻瓜式模型训练的软件,所以我现在准备来做......
  • 全流程机器视觉工程开发(二)PaddleDetection:拉框,然后开始训练模型
    前言我现在在准备做一个全流程的机器视觉的工程,之前做了很多理论相关的工作。大概理解了机器视觉的原理,然后大概了解了一下,我发现现在的库其实已经很发展了,完全不需要用到非常多的理论,只需要知道开发过程就可以了,甚至paddlex已经直接有了傻瓜式模型训练的软件,所以我现在准备来做......
  • paddle指定运行gpu
    在PaddlePaddle中指定使用GPU进行运行非常简单。首先,确保你的机器上已经安装了CUDA和cuDNN,并且正确配置了GPU环境。然后,按照以下步骤进行操作:导入PaddlePaddle库:importpaddle设置使用的设备为GPU:paddle.set_device('gpu')如果你有多块GPU,你可以选择指定使用的GPU编号:paddle.set_de......
  • 首个!百度飞桨会客厅落地广州,打通AI应用落地的“最后一公里”
    2023年,在大模型的浪潮下,各行各业使用AI技术的门槛被进一步降低,为AI技术创新广泛赋能产业发展提供了基础。百度依托全栈式的AI技术产品优势,推动AI产业人才培养,建设繁荣技术生态,加速AI技术在产业的规模应用。广州是国家人工智能创新应用先导区,百度AI技术生态已累计服务广州企业7747家......
  • 从飞桨PPDE到文心布道师
    随着深度学习技术的不断发展,大模型已经成为了业界的热点话题。在大模型时代,如何高效地开发、训练和应用模型成为了众多开发者面临的问题。为了帮助开发者更好地应对这一挑战,飞桨PPDE和文心布道师这两个平台应运而生。飞桨PPDE(PaddlePaddleDeveloperExperience)是飞桨平台为开发者......
  • 安谋科技“周易”NPU与飞桨完成II级兼容性测试,助力实现多样化AI部署
    近日,安谋科技(中国)有限公司(以下简称“安谋科技”)“周易”NPU系列IP与飞桨已完成II级兼容性测试,测试结果显示,双方兼容性表现良好,整体运行稳定。这是安谋科技加入“硬件生态共创计划”后的阶段性成果。产品兼容性证明本次II级兼容性测试完成了对计算机视觉、智能文本处理、人像分割三......
  • 【OpenVINO】 使用 OpenVINO CSharp API 部署 PaddleOCR 项目介绍
    前言: 在之前的项目中,我们已经使用OpenVINOTMCSharpAPI部署PaddleOCR全系列模型,但随着PaddleOCRv4版本发布以及OpenVINOCSharpAPI版本迭代,上一版本的项目已经不再适用。因此在推出的最新项目中,已经完成了对PaddleOCRv4的匹配,并且采用了最新版本的OpenVINOTMCSha......
  • 安装paddlespeech(三)
    前情回顾前面解决了paddlespeech的soxbindings的问题问题代码再次运行发现还有问题,下面是返回的错误代码Runningsetup.pydevelopforpaddlespeecherror:subprocess-exited-with-error×pythonsetup.pydevelopdidnotrunsuccessfully.│exit......