|
基于多隐藏层的BP神经网络:主要结构如下:- % 多隐藏层
- net=newff(inputn,output_train,[10,15],{'logsig','tansig'},'trainlm');
复制代码
主要代码如下:
- %% 该代码为基于多隐藏层的BP网络的语言识别
- %% 清空环境变量
- clc,clear,close all
- warning off
- format shortG
- % 训练数据预测数据提取及归一化
- %下载四类语音信号
- load data1 c1
- load data2 c2
- load data3 c3
- load data4 c4
- %四个特征信号矩阵合成一个矩阵
- data(1:500,:)=c1(1:500,:);
- data(501:1000,:)=c2(1:500,:);
- data(1001:1500,:)=c3(1:500,:);
- data(1501:2000,:)=c4(1:500,:);
- %从1到2000间随机排序
- k=rand(1,2000);
- [m,n]=sort(k);
- %输入输出数据
- input=data(:,2:25);
- output1 =data(:,1);
- %把输出从1维变成4维
- output=zeros(2000,4);
- for i=1:2000
- switch output1(i)
- case 1
- output(i,:)=[1 0 0 0];
- case 2
- output(i,:)=[0 1 0 0];
- case 3
- output(i,:)=[0 0 1 0];
- case 4
- output(i,:)=[0 0 0 1];
- end
- end
- %随机提取1500个样本为训练样本,500个样本为预测样本
- input_train=input(n(1:1500),:)';
- output_train=output(n(1:1500),:)';
- input_test=input(n(1501:2000),:)';
- output_test=output(n(1501:2000),:)';
- %输入数据归一化
- [inputn,inputps]=mapminmax(input_train);
- %% 网络结构初始化
- innum=24;
- midnum=25;
- outnum=4;
- %初始化网络结构
- nntwarn off
- % 多隐藏层
- net=newff(inputn,output_train,[10,15],{'logsig','tansig'},'trainlm');
- net.trainParam.epochs=100;
- net.trainParam.lr=0.1;
- net.trainParam.goal=0.00004;
- % 网络训练
- net=train(net,inputn,output_train);
- % BP网络预测
- % 训练样本--预测输出
- yc_train = sim(net,inputn);
- % 测试样本--预测输出
- inputn_test=mapminmax('apply',input_test,inputps);
- yc_test = sim(net,inputn_test);
- %% 结果分析
- % 根据网络输出找出数据属于哪类
- % 训练样本
- output_train_yc=zeros(1,1500);
- for i=1:1500
- output_train_yc(i)=find(yc_train(:,i)==max(yc_train(:,i)));
- end
- % 训练样本预测误差
- error_train = output_train_yc - output1(n(1:1500))';
- [eTa,eTb] = find(error_train==0);
- disp(['训练样本预测正确率为:', num2str( length(eTb)/length(error_train) )])
- % 测试样本
- output_test_yc=zeros(1,500);
- for i=1:500
- output_test_yc(i)=find(yc_test(:,i)==max(yc_test(:,i)));
- end
- % 测试样本预测误差
- error_test = output_test_yc - output1(n(1501:2000))';
- % 画出预测语音种类和实际语音种类的分类图
- figure(1)
- plot(output_test_yc,'r')
- hold on
- plot(output1(n(1501:2000))','b')
- legend('预测语音类别','实际语音类别')
- hold off
- % 画出误差图
- figure(2)
- plot(error_test)
- title('BP网络分类误差','fontsize',12)
- xlabel('语音信号','fontsize',12)
- ylabel('分类误差','fontsize',12)
- % 找出判断错误的分类属于哪一类
- k=zeros(1,4);
- for i=1:500
- if error_test(i)~=0
- [b,c]=max(output_test(:,i));
- switch c
- case 1
- k(1)=k(1)+1;
- case 2
- k(2)=k(2)+1;
- case 3
- k(3)=k(3)+1;
- case 4
- k(4)=k(4)+1;
- end
- end
- end
- % 找出每类的个体和
- kk=zeros(1,4);
- for i=1:500
- [b,c]=max(output_test(:,i));
- switch c
- case 1
- kk(1)=kk(1)+1;
- case 2
- kk(2)=kk(2)+1;
- case 3
- kk(3)=kk(3)+1;
- case 4
- kk(4)=kk(4)+1;
- end
- end
- % 正确率
- rightridio=(kk-k)./kk;
- disp('测试样本4类预测正确率分别为:')
- disp(rightridio);
复制代码
|
|