主要内容

字符识别

这个例子说明了如何训练神经网络来执行简单的字符识别。

定义问题

这个脚本prprob定义一个矩阵X有26列,每个字母一列。每一列有35个值,这些值可以是1或0。每列35个值定义一个字母的5x7位图。

矩阵T是一个26x26的单位矩阵,它将26个输入向量映射到26个类。

[X,T] = proprob;

这里A,第一个字母,被标为位图。

plotchar (X (: 1))

创建第一个神经网络

为了解决这个问题,我们将使用一个具有25个隐藏神经元的模式识别前馈神经网络。

由于神经网络是用随机的初始权值初始化的,每次运行示例时,训练后的结果都会略有不同。为了避免这种随机性,随机种子被设置为每次都重现相同的结果。这对于您自己的应用程序不是必需的。

setdemorandstream(π);Net1 =前馈网络(25);视图(net1)

训练第一个神经网络

这个函数火车将数据划分为训练集、验证集和测试集。训练集用于更新网络,验证集用于在网络过拟合训练数据之前停止网络,从而保持良好的泛化。测试集作为一个完全独立的衡量网络在新样本上的表现。

当网络不再可能改进训练或验证集时,训练就会停止。

net1。divideFcn =;net1 = train(net1,X,T,nnMATLAB);
计算资源:MATLAB在GLNXA64

{

第二神经网络的训练

我们希望网络不仅能识别完美的字母,还能识别有噪声的字母。因此,我们将尝试在噪声数据上训练第二个网络,并比较其与第一个网络的泛化能力。

这是每封信30份嘈杂的副本Xn创建。值受限于最小值而且马克斯介于0和1之间。相应的目标Tn也是有定义的。

numNoise = 30;Xn = min(max(repmat(X,1,numNoise)+randn(35,26*numNoise)*0.2,0),1);Tn = repmat(T,1,numNoise);

这是a的噪声版本。

图plotchar (Xn (: 1))

在这里,第二个网络被创建和训练。

Net2 =前馈网络(25);net2 = train(net2,Xn,Tn,nnMATLAB);
计算资源:MATLAB在GLNXA64

{

测试两个神经网络

noiseLevels = 0:.05:1;numLevels = length(noiseLevels);percError1 = 0 (1,numLevels);percError2 = 0 (1,numLevels);i = 1:numLevels Xtest = min(max(repmat(X,1,numNoise)+randn(35,26*numNoise)*noiseLevels(i),0),1);Y1 = net1(Xtest);percError1(i) = sum(sum(abs(Tn-compet(Y1))))/(26*numNoise*2);Y2 = net2(Xtest);percError2(i) = sum(sum(abs(Tn-compet(Y2))))/(26*numNoise*2);结束图绘制(noiseLevels percError1 * 100,“——”、noiseLevels percError2 * 100);标题(“识别错误百分比”);包含(“噪声”);ylabel (“错误”);传奇(“网络1”《网络2》“位置”“西北”

图中包含一个轴对象。标题为Percentage of Recognition Errors的axes对象包含2个类型为line的对象。这些对象表示网络1、网络2。

无噪声训练的网络1比有噪声训练的网络2有更多的噪声误差。