引言

任务介绍

图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,图像分类的挑战在于相似的视觉特性,不同的语义概念以及不相似的视觉特性,相同的语义概念。
猫狗分类属于图像分类中的粗粒度分类问题。
实践平台:百度AI实训平台AI-STUDIO。

任务目标

构建一个模型,根据鸢尾花的花萼和花瓣大小将其分为三种不同的品种。

模型选择

卷积神经网络(CNN)
卷积层:执行卷积操作提取底层到高层的特征,发掘出图片“局部特性”;
池化层:通过降采样的方式,在不影响图像质量的情况下,压缩图片,减少参数;
全连接层:池化完成后,将数据“拍平”,丢到Flatten层,然后把Flatten层的输出放到全连接层里,可采用softmax对其进行分类。

数据集

CIFAR-10数据集
cifar-10共60000张彩色图像,图像大小为3通道的32*32,分为10类,每类6000张
训练集:50000张用于训练,构成5个训练批,每批10000张图
测试集:其余10000张用于测试,单独成一批。
测试集从每类中随机取1000张,其余为训练集数据。

Paddle API提供了自动加载cifar数据集模块 paddle.dataset.cifar

注:左侧为CIFAR-10中代表的10个种类,右侧为每一类的10个随机图片。

实验步骤及过程

实践流程

实践流程
准备数据
配置网络
           定义网络
           定义损失函数
           定义优化算法
训练网络
模型评估
模型预测
***其中,定义好模型结构之后,我们要通过以下几个步骤进行模型训练:***

1.  网络正向传播计算网络输出和损失函数。
2.  根据损失函数进行反向误差传播,将网络误差从输出层依次向前传递, 并更新网络中的参数。
3.  重复1~2步骤,直至网络训练误差达到规定的程度或训练轮次达到设定值。

实验步骤

准备数据


导入必要的包:


下载数据集(创建文件夹,下载数据集,将数据集移动到指定目录):

输出显示:

说明下载成功,对这个图包的移动也已经成功。

训练数据集准备,测试数据集准备。按批次读取乱序后的数据,批次大小为batch_size(此处设置为200):

配置网络

定义CNN网络:

获取一个分类器,定义损失函数、准确率,以及定义优化方法:

运行输出:


在上述模型配置完毕后,得到两个fluid.Program:fluid.default_startup_program() 与fluid.default_main_program() 配置完毕了。

参数初始化操作会被写入fluid.default_startup_program()

fluid.default_main_program()用于获取默认或全局main program(主程序)。该主程序用于训练和测试模型。fluid.layers 中的所有layer函数可以向 default_main_program 中添加算子和变量。default_main_program 是fluid的许多编程接口(API)的Program参数的缺省值。例如,当用户program没有传入的时候, Executor.run() 会默认执行 default_main_program 。

模型训练

创建Executor:

首先定义运算场所 fluid.CPUPlace()和 fluid.CUDAPlace(0)分别表示运算场所为CPU和GPU

Executor:接收传入的program,通过run()方法运行program。

定义数据映射器:
DataFeeder 负责将reader(读取器)返回的数据转成一种特殊的数据结构,使它们可以输入到 Executor


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


训练并保存模型:

Executor接收传入的program,并根据feed map(输入映射表)和fetch_list(结果获取表) 向program中添加feed operators(数据输入算子)和fetch operators(结果获取算子)。 feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量。

每一个Pass训练结束之后,再使用验证集进行验证,并打印出相应的损失值cost和准确率acc。



输出结果:



从模型训练结果以及图像中可以很明显看到,我们可以看到输出的损失值在不断减小,证明我们的模型在不断收敛。随着每一次pass的增加,每一批次batch的train集训练后test集的cost损失在逐渐减小,训练集train的准确度在逐渐增加。最后训练模型保存完成,我们可以看到测试集在模型上的准确率已经达到72%左右。虽然只是刚刚过半,但对于我们新手来说这个准确度已经很棒了。

模型预测

创建预测用的Executor:
图片预处理:

在预测之前,要对图像进行预处理。

首先将图片大小调整为32*32,接着将图像转换成一维向量,最后再对一维向量进行归一化处理。

开始预测:

通过fluid.io.load_inference_model,预测器会从params_dirname中读取已经训练好的模型,来对从未遇见过的数据进行预测。


输出模型预测结果:


再对狗进行测试一下:


可见,我们的模型依旧是不完美的,原因可能是训练的次数不够或者选择的训练集特征过于明显进行了过度拟合。