如何使用matlab编写多输入单输出BP神经网络

做毕设遇到一个问题不会,请教各位大神:我做的是基于BP神经网络的指纹识别,现已将一个指纹特征点提取出来,存在一个.mat文件里。特征点有10个,用的是特征点的横坐标x、纵标y、该点坐的方向角来标记该特征点。现在我想用这一组特征点来进行训练,BP神经网络的输入为24个特征点的横坐标x、纵标y、该点坐的方向角,输出为1。我的代码如下:
clc;clear;

close all;

p=load('originaldata.txt');

p1=p';

t=[1];

% 训练数据归一化处理

[pn,inputps]=mapminmax(p1);

[tn,outputps]=mapminmax(t);

% 建立网络

net_1=newff(minmax(pn),[6,1],{'tansig','tansig'},'traingdm');

% 当前输入层权值和阈值

inputWeights=net_1.IW{1,1};

inputbias=net_1.b{1};

% 当前网络层权值和阈值

layerWeights=net_1.LW{2,1};

layerbias=net_1.b{2};

% 设置训练参数

net_1.trainParam.epochs=10000;

net_1.trainParam.goal=1e-4;

net_1.trainParam.show=50;

net_1.trainParam.lr=0.05;

net_1.trainParam.mc=0.9;

% 训练网络

[net,tr]=train(net_1,pn,tn);

A=sim(net_1,pn)

% 计算仿真误差

E = tn - A

MSE=mse(E);

% 误差图

figure(1)

plot(E,'- *')

title('BP网络训练误差','fontsize',10)

ylabel('误差','fontsize',10)

xlabel('样本','fontsize',10)
复制代码
但是运行时总是提示以下错误,不知道为什么,请大神指教啊!
??? Error using ==> network.train at 146
Targets are incorrectly sized for network.
Matrix must have 24 columns.

Error in ==> BP1 at 25
[net,tr]=train(net_1,pn,tn);

PS :输入数据如下(original.txt):
142.000000 17.000000 2.000000
205.000000 21.000000 2.000000
160.000000 36.000000 3.000000
196.000000 54.000000 1.000000
57.000000 58.000000 1.000000
128.000000 66.000000 3.000000
88.000000 68.000000 2.000000
232.000000 68.000000 1.000000
184.000000 75.000000 2.000000
45.000000 88.000000 0.000000

在你的代码基础上说了。
clc;clear;

close all;

p=load('originaldata.txt');%你问题最后说的数据文件名跟这个不同。

p1=p';

t=[1];% 这个输出(Targets)应该和输入数据对应,输入数据有10个,输出应该也是10个
所以改为 t是一个1x10的行向量,每个元素对应10个输入数据的输出。不知道你的训练数据的输出是不是都是1?我试了试假设你的数据的输出都是1,所以t=ones(1,10),可以运行。追问

感谢你的回答。数据文件名是我打错了。我想要的是:一个指纹上提取了一些特征点,然后用BP网络训练,让其输出一个代号(任意一个数字都可以,可以不是我上面说得1),下次我再次输入另外一组指纹特征点数据时(是同一个人的指纹),同样可以得出是这个人的指纹(即输出同样的代号)。总之,就是对指纹进行分类识别。
像你所说的,将t改为一个全是1的1x10的向量,我试了,不过误差太大了,请问你能帮忙解决吗?谢谢!

追答

那么意思是那10条数据是10个不同的指纹?,如果是的话就把输出改成
t=[1,2,3,4,5,6,7,8,9,10];吧,每个数字代表你的驯良数据的一个指纹。

追问

不是啊,10条数据时同一个指纹上的。我在一个指纹上提取了10个特征点,这就得到了10条数据,每条数据有三个值:横、纵坐标及方向角。像是这样,误差大的问题怎么解决?谢谢

追答

那BP神经网络的调节主要就是调隐层结点数和隐层的数量,你试试2层,你尝试一下多几个数字。还有把最后的那个转换函数改为线性函数应该会好一点。你再调节一下。最后加个调节如果训练输出为大于一个可接受的值,你就当做是1,否则0.误差的标准是输出的模式与期望的模式是否一致,即是正确率/预测总数这样更好。而不是你那样用E = tn - A的误差平方和。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答