【毕业设计】卷积神经网络分类器的设计及实现【源码+论文】

卷积神经网络分类器的设计及实现

目录
一、实验目的 3
二、实验方法 3
三、实验环境 5
四、数据集简介 6
五、实验步骤 8
六、实验结果 10
七、分类器评估 11
八、实验总结 12

一、实验目的
分类器设计是机器学习的主要研究方向,在大数据、人工智能领域应用广泛,分类模型可以将数据库中的数据映射到所属类别之一,继而可以应用于新的数据预测。随着研究的发展,机器学习领域不断涌现出新的分类器方法,从早期的决策树、近邻法,到支持向量机、神经网络等,这些方法都已先后在具体领域中得到有效使用。
分类器的设计使用主要分为三个步骤,首先选择样本数据集,将所有样本分成两部分,训练样本和测试样本。然后选择一个分类器,在训练样本上运行分类器算法,生成分类模型。最后用测试样本对分类模型进行预测评价,来衡量分类器效果。
衡量一个分类器的优劣主要有两个标准:分类准确率与泛化能力。以支持向量机(Support Vector Machine,SVM)为代表的分类器是典型的传统分类器方法,在人像识别、手写字符识别等分类识别任务中使用最早。而该类方法在进行识别时需要繁琐的特征构造,且手工的特征提取往往会削弱模型的泛化能力,很大程度限制了这些分类器的发展。与此同时,由于大数据和硬件计算能力的驱动,目前基于卷积神经网络的分类器方法受到更多关注。
卷积神经网络(Convolutional Neural Networks,CNN)是一种包含卷积计算且具有深度结构的前馈神经网络,是一种通过对样本数据底层特征的抽象组合来表达其内在规律的机器学习方法。CNN使用卷积运算代替一般矩阵乘法来实现特征提取,同时CNN具有局部感知与参数共享两大特点,这两点与图像的特征的局部性和重复性完美贴合,使CNN在图像分类识别领域有出色表现。
因此本文将选择卷积神经网络作为分类器设计方法,通过对手写数字图像进行分类识别来实现分类器。
二、实验方法
1、卷积神经网络分类器结构
图1为卷积神经网络一般结构,CNN在LeNet-5模型提出后,其组成结构被基本确定,网络一般由输入层、卷积层、池化层、全连接层、输出层组成。

图1 卷积神经网络一般结构
输入层、输出层作为首尾用于图像数据输入与结果输出表示,中间部分通常采用多组卷积层和池化层交替结构进行特征提取,在输出层前的几级网络通常设为全连接层,全连接层对前面所提特征进行非线性拟合将特征空间映射到标记空间,最终结果传给输出。下面对卷积神经网络分类器的具体组成结构进行简单介绍。
① 输入层
该层的主要处理是对原始图像数据进行预处理,这包括平均化,即将输入数据的所有维度居中为0,目的是将样本的中心返回到坐标的原点;归一化,即将幅度归一化到相同的范围内,减少各维度数据的取值范围不同带来的干扰。
② 卷积层
卷积神经网络中每层卷积层由若干卷积单元组成,卷积运算把输入图像看作是一个n维矩阵,然后拿一个m*m维卷积核从左至右、从上之下进行"扫描",每当移动到一个窗口后和对应的窗口做卷积运算即对应元素相乘之后加求和,计算过程如下图所示。

图2 卷积计算过程
卷积操作的目的是提取输入的各种特征。第一个卷积层可能只提取一些低级特征,例如边缘、线条和角点。网络的更多层可以从较低级别的特征中迭代地提取更复杂的特征。卷积计算结果将再通过非线性函数计算进行非线性映射输出从而实现分类器的非线性过程。
③ 池化层
池化层夹在连续的卷积层中间,用于压缩数据和参数的量,减小过拟合,池化层的最主要作用就是压缩图像,池化层用的方法有最大值池化和均值池化。
④ 全连接层
该层相当于多层感知机,其在整个卷积神经网络中起到分类的作用,通过前面多个“卷积-激活-池化”层的处理,待处理的数据特性已有了显著提高,全连接层输入的数据经过反复提纯过的结果,因此输出的分类品质要高得多。
2、卷积神经网络分类器训练方法
CNN在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。具体训练过程如下:
① 选定训练组,从样本集中分别随机地寻求N个样本作为训练组;
② 将各权值、阈值,置成小的接近于0的随机值,并初始化精度控制参数和学习率;
③ 从训练组中取一个输入模式加到网络,并给出它的目标输出向量;
④ 计算出中间层输出向量,计算出网络的实际输出向量;
⑤ 将输出向量中的元素与目标向量中的元素进行比较,计算出输出误差;对于中间层的隐单元也需要计算出误差;
⑥ 依次计算出各权值的调整量和阈值的调整量;
⑦ 调整权值和调整阈值;
⑧ 当经历M后,判断指标是否满足精度要求,如果不满足,则返回(3),继续迭代;如果满足就进入下一步;
⑨ 训练结束,将权值和阈值保存在文件中。这时可以认为各个权值已经达到稳定,分类器已经形成。再一次进行训练,直接从文件导出权值和阈值进行训练,不需要进行初始化。
根据以上结构原理,本文设计的卷积神经网络分类器由输入层、三组卷积、输出层构成,如下图所示:

图3 本文设计的卷积神经网络分类器结构
三、实验环境
由于卷积神经网络在MATLAB中已有了较好的开发使用,因此本文采用MATLAB2019作为开发环境,操作系统为Win10,训练中在单GPU上进行。
MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、深度学习、图像处理与计算机视觉、信号处理等领域。利用MATLAB作为开发环境可以方法的调用已有的库函数,编程操作较为简单,且逻辑可读性较好。MATLAB的神经网络工具箱,提供了大量的函数用于建立神经网络、网络的学习和训练,以及显示等。在命令行窗口中输入help nnet查看神经网络工具箱的版本和函数。同时,MATLAB的神经网络工具箱提供了很多的GUI工具,如nctool、nftool、nprtool等,方便图形化展示。
四、数据集简介
本文所设计的分类器将应用于手写体数字的图片数据集中,在该种数据集中最普遍使用、最标准的即为‘Mnist数据集’。
该数据集来由美国国家标准与技术研究所发起整理,一共统计了来自250个不同的人手写数字图片,其中50%是高中生,50%来自人口普查局的工作人员。该数据集的收集目的是希望通过算法,实现对手写数字的分类识别。该数据集自1998年起,被广泛地应用于机器学习和深度学习领域,用来测试算法的效果,例如线性分类器、K-近邻算法、支持向量机、神经网络、卷积神经网络等。Yan LeCun 等人发表了论文《Gradient-Based Learning Applied to Document Recognition》,首次提出了LeNet-5卷积神经网络,即利用上述数据集实现了手写字体的识别。
Mnist数据集的官网为http://yann.lecun.com/exdb/mnist/,官网上提供了数据集的下载,主要包括四个文件,文件名及其作用如下所示:

图4 Mnist数据集
在上述文件中,训练集一共包含了60000张图像和标签,而测试集一共包含了10000张图像和标签,数据集的大小统一为28281的黑白图像。测试集中前5000个来自最初NIST项目的训练集,后5000个来自最初NIST项目的测试集。前5000个比后5000个要规整,这是因为前5000个数据来自于美国人口普查局的员工,而后5000个来自于大学生。
下载上述四个文件后,将其解压会发现,得到的并不是一系列图片,而是.idx1-ubyte和.idx3-ubyte格式文件,是一种IDX数据格式,其基本格式如下:

图5 Mnist数据集格式
其中,magic number为4字节,前2字节永远是0,第3字节代表数据的格式,第4字节的含义表示维度的数量。因此需要单独编写程序进行数据集提取,本文训练集数据与样本标签的Matlab读取程序主要如下:

%% 读取训练图片数据文件
[FileName,PathName] = uigetfile(‘.’,‘选择训练图片数据文件train-images.idx3-ubyte’);
TrainFile = fullfile(PathName,FileName);
fid = fopen(TrainFile,‘r’);
a = fread(fid,16,‘uint8’);
MagicNum = ((a(1)*256+a(2))*256+a(3))*256+a(4);
ImageNum = ((a(5)*256+a(6))*256+a(7))*256+a(8);
ImageRow = ((a(9)*256+a(10))*256+a(11))*256+a(12);
ImageCol = ((a(13)*256+a(14))*256+a(15))256+a(16);
savedirectory = uigetdir(‘’,‘选择保存训练图片路径:’);
h_w = waitbar(0,‘请稍候,处理中>>’);
for i=1:1000
b = fread(fid,ImageRow
ImageCol,‘uint8’);
c = reshape(b,[ImageRow ImageCol]);
d = c’;
e = 255-d;
e = uint8(e);
savepath = fullfile(savedirectory,[‘TrainImage_’ num2str(i,‘%05d’) ‘.bmp’]);
imwrite(e,savepath,‘bmp’);
waitbar(i/ImageNum);
end

%% 读取训练图片数据标签
clc; clear all;
filename = ‘./train-labels-idx1-ubyte/train-labels.idx1-ubyte’;
fp = fopen(filename, ‘rb’);
assert(fp ~= -1, ['Could not open ', filename, ‘’]);
magic = fread(fp, 1, ‘int32’, 0, ‘ieee-be’);
assert(magic == 2049, ['Bad magic number in ', filename, ‘’]);
numLabels = fread(fp, 1, ‘int32’, 0, ‘ieee-be’);
Trainlabels = fread(fp, inf, ‘unsigned char’);

利用上述程序读取后的数据集如下图所示:

图5 Mnist数据集训练集展示

图6 Mnist数据集测试集展示
由于Mnist数据集样本为几万张,数据量较大,因此本文仅采用其中部分作为实验数据集。训练集采用Mnist训练集的TrainImage_00001-TrainImage_01000共1000张作为训练集;测试集为TestImage_00001-TestImage_01000,也是1000张。
五、实验步骤
1、导入数据集
首先按照第四节中读取Mnist数据集的方法将原始数据集转成图片形式,然后再对其进行读取,以转成Matlab训练神经网络分类器所需的格式,主要程序如下:

%% 读取训练数据
load(‘Trainlabels.mat’) % 标签
mineSetTrain = imageDatastore(‘./MinistTrain1000/’, ‘FileExtensions’,‘.bmp’,…
‘IncludeSubfolders’,false);
for i = 1:1000 % 数据集共1000张
mLabelsTrain{i,1} = num2str(Trainlabels(i));
end
mLabelsTrain1 = categorical(mLabelsTrain);
mineSetTrain.Labels = mLabelsTrain1;
disp(countEachLabel(mineSetTrain))

%% 读取测试数据
load(‘Testlabels.mat’) % 标签
mineSetTest = imageDatastore(‘./MinistTest1000/’, ‘FileExtensions’,‘.bmp’,…
‘IncludeSubfolders’,false);
for i = 1:1000 % 数据集共1000张
mLabelsTest{i,1} = num2str(Testlabels(i));
end
mLabelsTest1 = categorical(mLabelsTest);
mineSetTest.Labels = mLabelsTest1;
disp(countEachLabel(mineSetTest))

通过以上过程将原始的训练集、测试集各1000张图片分别转成mineSetTrain、mineSetTest,它们同时包含1000张28281的图像数据和其对应的所属标签信息。
2、定义卷积神经网络结构
根据需要合理设置神经网络的层级结构,具体结构在本文第二节实验方法中已给出,即网络由输入层、三组卷积、输出层构成。在卷积层中通过加入批量归一化batchNormalizationLayer以减小过拟合情况,卷积层的激活函数采用reluLayer函数,池化层采用最大值池化方式,最后输出层通过softmax函数实现分类。
定义卷积神经网络结构的主要程序如下:
%% 定义卷积神经网络结构
layers = [
% 输入层
imageInputLayer([28 28 1], ‘Name’,‘input’)
% 卷积层1
convolution2dLayer(5,6,‘Padding’,2, ‘Name’,‘conv1’) % 卷积
batchNormalizationLayer(‘Name’,‘batchNormal1’) % 批量归一化
reluLayer(‘Name’,‘reluLayer1’) % 激活
maxPooling2dLayer(2,‘stride’,2,‘Name’,‘maxPool1’) % 池化
% 卷积层2
convolution2dLayer(5,16, ‘Name’,‘conv2’)
batchNormalizationLayer(‘Name’,‘batchNormal2’)
reluLayer(‘Name’,‘reluLayer2’)
maxPooling2dLayer(2,‘stride’,2, ‘Name’,‘maxPool2’)
% 卷积层3
convolution2dLayer(5,120, ‘Name’,‘conv3’)
batchNormalizationLayer(‘Name’,‘batchNormal3’)
reluLayer(‘Name’,‘reluLayer3’)
% 输出层
fullyConnectedLayer(10, ‘Name’,‘full’)
softmaxLayer(‘Name’,‘softmax’)
classificationLayer(‘Name’,‘classOutput’)
];

3、设置卷积网络训练参数并训练
网络训练参数主要为优化器选择与最大Epochs设置,其它参数采用Matlab给的默认值,并设置显示训练信息与进度。网络训练采用trainNetwork进行,输入为训练集数据mineSetTrain、网络结构layers与网络参数options,主要程序如下所示:

%% 设置卷积网络训练参数
options = trainingOptions(‘sgdm’,… % sgdm优化器
‘MaxEpochs’,30,… % 最大Epochs设为50
‘Verbose’,true,… % 显示信息
‘Plots’,‘training-progress’); % 显示训练的进度
%% 训练神经网络
net = trainNetwork(mineSetTrain, layers, options);

4、测试数据集分类效果
完成训练后,对所得分类器模型net进行测试,分类函数为classify,输入网络模型net与测试集mineSetTest,通过比较分类器分类结果YPred与真实结果YValidation来比较分类器的分类识别效果。主要程序如下:

%% 测试数据集分类效果
YPred = classify(net, mineSetTest);
YValidation = mineSetTest.Labels;
% 计算正确率
accuracy = sum(YPred == YValidation)/numel(YValidation)*100;

六、实验结果
1、训练过程中
在上述试验方法、数据集、步骤下,分类器训练过程中的打印信息如下:

图7 训练过程打印信息

图8 训练进度
从图7、图8可见随着迭代增加,训练集的批量准确率从16%显著提升至100%,批量损失减小至0.01,说明在训练集上取得完美效果。
2、测试集分类效果
对于测试集测试结果表明,1000张测试集上有925张分类正确,整体识别率为92.5%。图9给出了测试集分类的效果图,从图中可见分类的整体效果较好,分类错误的标签只占很小比例。

图9 测试集分类效果
图10给出了10张测试集的分类结果,其中第二张识别错误,将5识别为8。从图中可见该错误图片的‘5’书写不标准,有一定程度像‘8’,因此分类器识别为8。

图10 测试集样本展示
七、分类器评估
根据上述实验结果表明,本文所设计的卷积神经网络分类器对手写数字图像分类识别取得了很好的效果,在1000个样本的训练集条件下,能达到92.5%的识别率,另外在数据集样本为5000时的训练中,所得分类器对测试集能达到95%的准确率,其可靠度某种程度上已高于人工水平。
表明卷积神经网络分类器是一种高效、无需手动提取特征的分类器,在对图像进行分类识别中效果显著,且通过增加数据集样本能有效提高识别率,这为大数据时代下的分类提高方便。
八、实验总结
本次分类器设计与实现实验,我实现了一套分类系统,完成了对手写数字图像的识别,且取得了较好结果。实验中通过对卷积神经网络的研究分析,感受到了神经网络的魅力与强大功能,对神经网络研究产生了一些兴趣。同时,实验中为实现功能,通过查找资料等方式也提高了matlab编程能力,尤其是在进行数据集处理与分类器设计中,通过不断试错尝试,逐步得到理想效果,这也将为后续学习工作提供了帮助。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷积神经网络分类器在图像识别、目标检测、自然语言处理等方面有着广泛的应用。 以图像分类为例,我们可以使用卷积神经网络分类器来对图像进行分类。具体的应用场景包括人脸识别、车辆识别、动物识别等。 在人脸识别中,我们可以使用卷积神经网络分类器来对人脸图像进行分类,以识别出不同的人脸。在车辆识别中,我们可以使用卷积神经网络分类器来对车辆图像进行分类,以识别出不同的车型。在动物识别中,我们可以使用卷积神经网络分类器来对动物图像进行分类,以识别出不同的动物种类。 在分类器设计方法的选择上,我们可以根据具体的应用场景来选择不同的方法。例如,在图像分类中,我们可以选择使用经典的卷积神经网络结构,如LeNet、AlexNet、VGG、ResNet等,也可以使用更加先进的结构,如Inception、Xception、MobileNet等。 神经网络的原理是通过对输入数据进行一系列的线性和非线性变换,以提取输入数据的特征,最终将特征映射到相应的输出结果上。神经网络的训练过程通常使用反向传播算法来更新网络中的参数,以使网络的输出尽可能接近训练数据的真实标签。 在神经网络结构流程设计上,我们需要根据具体的应用场景来设计合适的结构。一般来说,卷积神经网络包括卷积层、池化层、全连接层等不同类型的层,我们需要根据具体的输入数据的特点来选择不同的层,并将它们组合起来构建出合适的神经网络结构。 在神经网络算法程序设计上,我们需要使用相应的深度学习框架,如PyTorch、TensorFlow等来实现神经网络算法,并进行训练和测试。具体的程序实现过程可以参考相应的深度学习框架的文档和教程。 在程序仿真及结果分析上,我们需要使用相应的数据集来进行训练和测试,并对训练和测试结果进行分析和评估,以确定模型的性能和效果。具体的分析和评估指标包括准确率、召回率、F1值等。 最后,在结论中,我们需要总结出模型的性能和效果,并对模型的优缺点进行评价和分析。同时,我们也需要对未来的研究工作进行展望,以推进该领域的发展。 参考文献: [1] LeCun Y, Bengio Y, Hinton G. Deep learning[J]. Nature, 2015, 521(7553): 436-444. [2] Goodfellow I, Bengio Y, Courville A. Deep learning[M]. MIT Press, 2016. [3] Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition[J]. arXiv preprint arXiv:1409.1556, 2014. [4] He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值