一个神经网络模式识别的例子------螃蟹识别

来源:互联网 发布:网络校时原理 编辑:程序博客网 时间:2024/04/28 13:08
本文来自神经网络之家 www.nnetinfo.com
作者:梁小h   日期:2015-09-22 11:11:33.0

模式识别主要解决分类问题,由于分类问题的输出是离散的,而曲线拟合的输出是连续的,因此分类问题的解决方案会与曲线拟合问题的解决方案存在一些差异。

差异关键在于输出:

在神经网络模式识别中,我们不会以 1 2 3 4 5..这样的序列号来表示我们的输出,一般会用 0 1向量来表示输出。例如一共有三个种类,则 用[0 1 0 ]表示它属于第二类。

特 别注意:模式识别中不用 1 2 3…12这样的序列作为网络的输出,是因为类别与类别之间并不存在数量的大小关系,直接把类别标为1 2 3 ..12的话,计算误差时会受1 2 3 ..12的数量大小关系的影响。例如一个属于类别10的样本在网络中被预测为类别2的时候,会被认为误差很大,而它输出9的时候会被认为误差比较小,实际 上输出9和输出2都是完全判断错误的,但会导致网络误差估计不准确,影响网络的训练

模式识别可以用通用的神经网络来建立,但matlab神经网络工具箱提供专门的模式识别神经网络模型Patternnet来处理这类问题。

Patternnet网络的拓扑大概如下图:


Patternnet与标准的神经网络不同之处在于,网络的输出层传递函数不是purelin,而是tansig,而且输出会归一到[0,1]。另一方面,matlab采取的默认训练函数也不一样,用的是量化共轭梯度法trainscg.


2012B版本中自带螃蟹识别例子R2012b\toolbox\nnet\nndemos\classify_crab_demo.m是一个很好的学习神经网络模式识别的例子,输入输出数据截图如下:


下面是作者简化改编后的代码:
 

%神经网络之家  2015-9-21
%请在2012B运行,其它版本的matlab未确定是否能够顺利运行。

load crab_dataset

x = crabInputs; 

t = crabTargets;

 

setdemorandstream(491218382);%指定随机种子,这样每次训练出来的网络都一样。

 

net = patternnet(10);        %建立模式识别网络,隐层设为10个

[net,tr] = train(net,x,t);   %将数据放到网络中训练

plotperform(tr)              %画出训练记录

 

%%用检验数据检验网络的正确率

testX = x(:,tr.testInd);

testT = t(:,tr.testInd);

 

testY = net(testX);

testIndices = vec2ind(testY);

 

 %% 画出混淆矩阵,并计算正确率

plotconfusion(testT,testY)

[c,cm] = confusion(testT,testY)  %计算混淆矩阵

 

fprintf('Percentage Correct Classification   : %f%%\n', 100*(1-c));

fprintf('Percentage Incorrect Classification : %f%%\n', 100*c);

figure

plotroc(testT,testY)

运行程序后可以得到训练好的net,

假如输入是X=[1 2 5 8 10 12]’;

可以使用Y=net(X);

来得到形如Y=[0 1]格式的输出,这样就知道它是第2类。

提示:可借助vec2ind函数将 [0 1 ] 转为数字2.

 

至于怎么提取网络的表达式,和网络的使用,在这里不再重复讲述。请有兴趣的同学参考其它文章。

 

值得一提的是运行后得到的混淆矩阵,这里加上我的注解。


从混淆矩阵图中清晰看到分类的效果。

本例数据与程序下载:一个神经网络模式识别的例子------螃蟹识别代码






0 0
原创粉丝点击