基于BP神经网络的手写数字识别(Matlab代码实现)

 

一、 概述

   在人工智能的影响下,机器学习和深度学习也重新掀起了一股热潮。目前人工智能包含语音识别、自然语音处理、计算机视觉、机器学习四大部分[1,2]。其中机器学习是人工智能发展最快的分支之一。

计算机技术和网络技术的发展,大量的数字信息在进行处理之前需要通过一定的方式采集到计算机之中,如信件上的邮政编码,银行各种票据上的数字信息,试卷上的准考证号,物流行业中手写快递单据等手写数字的录入等都可通过手写体数字识别技术来进行识别,提高效率,节省了人力。手写数字识别方法从原理上大致可以分为基于统计特征分类、基于结构特征分类、基于神经网络三大类算法[3.4]。笔者主要针对BP神经网络在手写数字识别方面的技术进行了matlab实现。

二、运行结果

部分代码:

function mytrain(trainSet,trainSet_d,validationSet,validationSet_d)
%MYTRAIN用于训练BP神经网络
global w1 w2 epochs goal max_fail sigma validation
fail = 0;     %当前失败次数
count = 0;      %当前迭代次数
sigma = zeros(1);    %训练集的误差
validation = zeros(1);    %验证集的误差
trainSet_N = size(trainSet,2);
validationSet_N = size(validationSet,2);

while count<epochs         %进行规定次数的迭代

%对全部样本进行遍历,更新权值
i=1;
while i<=trainSet_N
     input = trainSet(:,i);
     expect_d = trainSet_d(:,i);
     i=i+1;
     bp(input,expect_d);
end

count=count+1;     %迭代次数加1

%计算训练集的当前误差
hidden = w1*trainSet;
hidden = sigmf(hidden,[1 0]);
o = w2*hidden;
o = sigmf(o,[1 0]);
e = trainSet_d-o;
sum = 0;
for num = 1:trainSet_N
   E = e(:,num);
   sum = sum+E.'*E;
end
sigma(count) = sum/2;

%运行过程可视化
sprintf('第%d次迭代,误差为%f',count,sigma(count))

%判断是否已达到目标误差,若是,退出迭代过程
if sigma(count) <= goal 
    sprintf('Goal is reached!')
    break
end

%计算验证集误差
v_hidden = w1*validationSet;
v_hidden = sigmf(v_hidden,[1 0]);
v_o = w2*v_hidden;
v_o = sigmf(v_o,[1 0]);
v_e = validationSet_d-v_o;
v_sum = 0;
for v_num = 1:validationSet_N
    v_E = v_e(:,v_num);
    v_sum = v_sum+v_E.'*v_E;
end
validation(count) = v_sum/2;

%判断验证集误差是否连续上升
if count ~= 1
    if validation(count) > validation(count-1)
        fail = fail+1;
    else
        fail = 0;
    end
end

%备份验证误差上升前的权值
if fail == 0
    best_w1 = w1;
    best_w2 = w2;
end

%判断误差是否连续上升若干次迭代,若是则停止训练
if fail >= max_fail
    w1 = best_w1;
    w2 = best_w2;
    sprintf('Validation stop.')
    break
end

end

完整代码:神经网络的手写数字识别

三、参考文献

[1]许朋.基于BP神经网络的手写数字识别[J].科技视界,2020(11):51-53.DOI:10.19694/j.cnki.issn2095-2457.2020.11.019.

四、Matlab代码实现

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字识别是机器学习中的一个重要应用,它可以用于数字化文字、自动化识别、人机交互等领域。在本文中,我们将介绍如何使用Matlab实现基于BP神经网络数字识别。 1. 数据预处理 数字识别需要大量的训练数据,我们可以使用MNIST数据集进行训练。MNIST数据集由60000个训练样本和10000个测试样本组成,每个样本为28x28的灰度图像,表示一个数字0-9。 在Matlab中,我们可以使用load函数加载MNIST数据集。代码如下: load('mnist_all.mat'); 其中,mnist_all.mat是MNIST数据集的Matlab格式文件,包含了10个文件,每个文件对应一个数字。我们可以使用for循环遍历这些文件,读取图像数据,并将其转换为神经网络训练所需的格式。代码如下: % 初始化数据 X_train = []; Y_train = []; X_test = []; Y_test = []; % 遍历MNIST数据集 for i = 0:9 % 读取训练数据 filename = ['train' num2str(i) '.mat']; data = load(filename); X_train = [X_train; data.train_images]; Y_train = [Y_train; repmat(i, size(data.train_images, 1), 1)]; % 读取测试数据 filename = ['test' num2str(i) '.mat']; data = load(filename); X_test = [X_test; data.test_images]; Y_test = [Y_test; repmat(i, size(data.test_images, 1), 1)]; end % 将图像数据转换为神经网络训练所需的格式 X_train = double(X_train') / 255; Y_train = ind2vec(Y_train' + 1); X_test = double(X_test') / 255; Y_test = ind2vec(Y_test' + 1); 在上面的代码中,我们使用ind2vec函数将标签数据转换为one-hot编码,以便于神经网络的输出和计算误差。同时,我们将图像数据进行归一化处理,将像素值的范围从[0, 255]缩放到[0, 1],以便于神经网络的训练。 2. 神经网络模型设计 在本文中,我们使用BP神经网络进行数字识别BP神经网络是一种前向反馈神经网络,它可以通过反向传播算法来训练网络权重,从而实现对输入数据的分类。 在Matlab中,我们可以使用feedforwardnet函数创建BP神经网络代码如下: % 创建BP神经网络 net = feedforwardnet([100, 50]); 其中,feedforwardnet函数的第一个参数为一个数组,表示神经网络的隐层结构。在上面的代码中,我们创建了一个包含100个神经元的第一层隐层和50个神经元的第二层隐层的BP神经网络。 3. 神经网络训练 创建完神经网络后,我们需要对其进行训练。在Matlab中,我们可以使用train函数对神经网络进行训练。代码如下: % 配置训练参数 net.divideParam.trainRatio = 0.8; net.divideParam.valRatio = 0.2; net.divideParam.testRatio = 0; net.trainParam.epochs = 100; net.trainParam.lr = 0.01; % 训练神经网络 [net, tr] = train(net, X_train, Y_train); 在上面的代码中,我们首先对训练参数进行了配置,包括训练集、验证集、测试集的比例、训练轮数以及学习率等。然后,我们使用train函数对神经网络进行训练,并返回训练后的神经网络和训练信息。 4. 神经网络测试 训练完神经网络后,我们需要对其进行测试。在Matlab中,我们可以使用sim函数对神经网络进行测试。代码如下: % 测试神经网络 Y_pred = sim(net, X_test); 在上面的代码中,我们使用sim函数对测试集数据进行预测,并返回预测结果。 5. 结果分析 最后,我们需要对预测结果进行分析。在Matlab中,我们可以使用plotconfusion函数绘制混淆矩阵,以评估神经网络的分类性能。代码如下: % 绘制混淆矩阵 plotconfusion(Y_test, Y_pred); 在上面的代码中,我们使用plotconfusion函数绘制混淆矩阵,并将真实标签数据和预测结果作为输入参数。 除了混淆矩阵,我们还可以使用其他指标来评估神经网络的性能,比如准确率、精确率、召回率等。在Matlab中,我们可以使用confusionmat和perfcurve函数分别计算混淆矩阵和ROC曲线等指标。代码如下: % 计算混淆矩阵 C = confusionmat(vec2ind(Y_test), vec2ind(Y_pred)); % 计算ROC曲线 [X, Y, T, AUC] = perfcurve(vec2ind(Y_test), vec2ind(Y_pred), 10); 在上面的代码中,我们使用confusionmat函数计算混淆矩阵,并使用perfcurve函数计算ROC曲线及其AUC值。 综上所述,我们可以使用Matlab实现基于BP神经网络数字识别,并通过混淆矩阵、ROC曲线等指标来评估神经网络的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值