"神经网络应用于手写数字识别-matlab"
神经网络是机器学习中的一种常用技术,它可以应用于各种领域,包括图像识别、自然语言处理、语音识别等。本文主要介绍了神经网络在手写数字识别中的应用,使用 MATLAB 进行实现。
神经网络的基本结构包括输入层、隐含层和输出层。BP 神经网络是一种常用的神经网络模型,它可以通过反向传播算法进行训练。在本文中,我们使用 BP 神经网络来识别手写数字。
实验要求:
1. 使用 MATLAB 编程进行神经网络的实现。
2. 使用 BP 神经网络来识别手写数字。
实验过程:
一、BP 神经网络
BP 神经网络是由很多神经元组成,可以分为输入、输出、隐含层。BP 神经网络的特点是信号前向传递,信号反向传播。若输出存在误差,根据误差调整权值和阈值,使网络的输出接近预期。
在使用 BP 神经网络进行预测之前,需要训练网络。训练过程包括:
1. 网络初始化:确定输入、输出、隐含层的节点数,输入和隐含、隐含和输出层之间的权值,隐含、输出层的阈值,学习速度和激励函数。
2. 计算隐含层输出
3. 计算输出层输出
4. 误差计算
5. 权值更新
6. 阈值更新
7. 判断迭代是否结束
二、模型建立
数据集包含 0-9 这 10 个数字的手写体,是放在 10 个文件夹里,每个文件夹下有 500 张图片,每张图片的像素统一为 28*28。
识别流程:
首先要对数据进行处理,这个主要是批量读取图片和特征提取的过程。特征提取的方法很多,这里只挑选最简单的来实现。然后是训练出一个神经网络的模型,最后用测试数据进行测试。
分类结果训练运行流程:
1. 确定神经网络的输入、输出。输入是 BP 神经网络很重要的方面,输入的数据是手写字符经过预处理和特征提取后的数据。
2. 神经网络的训练
使用 MATLAB 的 rands 函数来实现网络权值的初始化,网络结构为输入层 35,隐藏层 34,输出层 10,学习速率为 0.1,隐藏层激励函数为 sigmoid 函数。
3. 神经网络的预测
训练好神经网络之后,用随机抽取的 500 个数字字符对网络进行预测,输入特征向量,计算隐含层和输出层输出,得到最后预测的数据。同时计算每个数字的正确率和全体的正确率。
主函数:
```matlab
clc;
img=read_train(root);
%% 提取特征
img_feature=feature_lattice(img);
%% 构造标签
class=10;
numberpclass=500;
ann_label=zeros(class,numberpclass*class);
for j=numberpclass*(i-1)+1:numberpclass*i
%% 选定训练集和测试集
ntraindata=4500;
ntestdata=500;
accuracy=size(find(error==0),2)/size(label,2)
```
批量读取图片函数:
文件存放特点:在 data 下有 10 个子文件夹,每个子文件夹下有 500 张图片。函数可以利用于任何批量图片的读取,传入的是文件夹路径,输出的是一个 n(对应图片数目)维 cell,每个 cell 存放的是图片的数据。
```matlab
function [imglist] = read_train(root)
%========读取文件夹========
out_Files = dir(root);
%展开
tempind=0;
n=length(out_Files);
%========读取文件========
for i = 1:n
ni=length(in_filelist);
for j=1:ni
if strcmp(in_filelist(j).name,'.')|| strcmp(in_filelist(j).name,'..')
continue
end
imglist{tempind}=imread(strcat(rootpath,'/',in_filelist(j).name));
end
end
end
```
特征提取函数:
提取所有图像的特征,二值化—resize-提取特征
```matlab
function feature = feature_lattice(img)
% 输入:黑底白字的二值图像。
% 输出:35 维的网格特征
% ======提取特征,转成 5*7 的特征矢量,把图像中每 10*10 的点进行划分相加,进行相加
Atemp=sum(bw_7050);
...
```
实验结果:
通过实验,我们使用 BP 神经网络成功地识别了手写数字,总体正确率为 0.8620。这证明了神经网络在手写数字识别中的应用价值。