用matlab使用神经网络对手写数字识别

用matlab使用神经网络对手写数字识别

学生:曾翰宇
老师:杨波

一,网络设计
数据库中的 minst 数据是 6 万个 28* 28 的矩阵,用 20 个 9* 9 的滤波器对其进行卷积,2828 的矩阵降为 20 个 2020 的特征矩阵,这是特征提取网络。
接着这些矩阵将通过 ReLU 激活函数后,进入池化层。
池化层采用 22 子矩阵的平均池化过程。于是 20 个 20 20 的特征矩阵将变为20 个 10* 10 的特征矩阵删除。
分类神经网络由单个隐含层和输出层构成。隐含层有 100 个节点,使用
ReLU 激活函数,因为要对将结果分为 10 类,输出层有 10 个节点。输出节点上使用 Softmax 激活函数。
网络中包括 3 个要训练的权重矩阵,分别是卷积层中滤波器图像处理需要的权重,以及从池化层到隐含层的连接权重和隐含层到输出层间的连接权重, 我在程序中分别把他们设为 W1,W5,W0。
二,训练方法
在这个网络中,我选用了梯度下降的算法来更新参数,然后在隐层和卷积池化层中 BP 算法来反向更新权重,减少误差。
最开始我本来没有在这个网络中加入批量算法,但是在我将整个样本运行数轮后,获得的结果耗时已经接近 500 秒,但是准确率还不到百分之 93,我意识到必须得添加一个小批量算法来提高准确度。
为了降低计算时间。我先设置了 500 个数据为一个批次。在运行后发现时间
虽然较快,但是准确率只有 95%,于是我进一步的调整批量大小,在批次数为 100 时,能基本达到要求。
在这里插入图片描述

然后我在每一个世代由对数据库中的数据进行打乱重新排列,获得了新的数据库,用他来进行训练,共训练 3 个世代,成功的将识别率进一步提高。for epoch = 1:3
for epoch = 1:3
A=randperm(60000); for i=1:10
D(i,:)=D(i,A);
end
for a=1:28
for b=1:28 X(a,b,:)=X(a,b,A);
end
for a=1:28
for b=1:28
X(a,b,:)=X(a,b,A);
end
end
[W1, W5,W0]= MnistConv (W1, W5, W0,X,D);
end
在这里插入图片描述

在设置 bsize 为 100 以后,算法总共要运行 600 轮。将每一轮第一次训练的数据计入 blist 中。通过 blist 找到某个 batch 的起始点 begin,通过每个minibatch 来更新权重值,进行 600 轮为一个世代。
而且我还使用了动量来计算权重,分别设置了 moment1,moment5,moment0作为动量。
momentum1 = alpha* dW1+beta* momentum1; W1= W1+momentum1;
momentum5 = alpha* dW5+beta* momentum5; W5 = W5+momentum5;
momentum0 = alpha* dW0+beta* momentum0; W0 = W0+momentum0;
最后便是误差的反向传播,输出层到上一层的传播使用了交叉熵和softmax 函数。接下来隐含层采用了 ReLU 激活函数,再由池化层往卷积层反向传播,来减小 W1 的误差。
以上内容都收录于 MnistConv 函数中。

在这里插入图片描述

这是主函数。

三,结果

由此可见,在最后一万个测试数据中有 158 个识别错误。远远优于没设置小批量时候的测试结果,我对此还是比较满意。
结果分析,在观看了识别错误的图片数据以后,我觉得出错的原因可能是因为有一些图片中的手写数字并未处于格子的中间,导致了在卷积层和池化层简化矩阵时,将重要的数据内容忽略,或是给予了较小的权重,以至于不能较好的识别。

四,体会
在知晓了算法的原理后,我发现人工智能也并没有我之前所想象的高深莫测, 也不过一个又一个的计算交织起来,让我不会对这方面的知识敬而远之,反而更有兴趣。
我最惊喜的一点是,每一点的改进对于算法来说都能有所提升,每一世代对数据库乱序这点我本来不抱希望,却没想到最后真的让我的算法准确度提高。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值