BP神經網路 語音訊號分類
BP神經網路預測首先進行訓練網路,通過訓練使網路具有聯想記憶和預測能力,
BP神經網路的訓練過程包括下面:
1、網路的初始化,根據系統輸入和輸出確定網路的輸入層節點數n,隱含層l,和輸出層m,初始化輸入層隱含層和輸出層之間的連線權值和偏移,給定學習速率和激勵函式
2、隱含層輸出的計算,根據輸入向量x,輸入層和隱含層之間連線的權重w,以及隱含層閾值a,計算隱含層的輸出H
3、輸出層的輸出計算,,,根據隱含層的輸出,連線權值和偏移 計算出神經網路的輸出
4、計算誤差, 計算神經網路預測輸出值和期望輸出值之間的誤差e
5、權值的更新
在進行程式之前 需要對資料進行處理,
資料的歸一化是在資料處理時常用的方法,吧所有的資料轉化到【0 1】之間,這樣的目的主要是消除各個資料間的數量級差別,避免因為資料數量級之間的差別導致的誤差增大;
常用的方法有兩種:
1 x=(X-Xmin)/(Xmax-Xmin);
Xmin Xmax分別為資料的最大和最小值
2\x=(X-Xmean)/Xvar;
Xmean表示資料的均值,,Xvar表示資料的方差
在實際中可以直接呼叫函式 mapminmax(X) 直接處理資料
【X in]=mapminmax(X) --------------------------------------in指的是歸一化得到的結構體,包含著資料的最大值最小值,平均值等資訊,,用於測試資料中
想要把資料反之過來可以
X=mapminmax('apply',x,in) ------------------對測試資料的歸一化 嗎,根據in的值對資料進行歸一化,
X=mapminmax('reverse',x,on)
<span style="font-size:18px;">%% 該程式碼為基於BP網路的語言識別 %% 清空環境變數 clc clear %% 訓練資料預測資料提取及歸一化 %下載四類語音訊號 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; %權值初始化 w1=rands(midnum,innum); b1=rands(midnum,1); w2=rands(midnum,outnum); b2=rands(outnum,1); w2_1=w2;w2_2=w2_1; w1_1=w1;w1_2=w1_1; b1_1=b1;b1_2=b1_1; b2_1=b2;b2_2=b2_1; %學習率 xite=0.1; alfa=0.01; loopNumber=10; I=zeros(1,midnum); Iout=zeros(1,midnum); FI=zeros(1,midnum); dw1=zeros(innum,midnum); db1=zeros(1,midnum); %% 網路訓練 E=zeros(1,loopNumber); for ii=1:loopNumber E(ii)=0; for i=1:1:1500 %% 網路預測輸出 x=inputn(:,i); % 隱含層輸出 for j=1:1:midnum I(j)=inputn(:,i)'*w1(j,:)'+b1(j); Iout(j)=1/(1+exp(-I(j))); end % 輸出層輸出 yn=w2'*Iout'+b2; %% 權值閥值修正 %計算誤差 e=output_train(:,i)-yn; E(ii)=E(ii)+sum(abs(e)); %計算權值變化率 dw2=e*Iout; db2=e'; for j=1:1:midnum S=1/(1+exp(-I(j))); FI(j)=S*(1-S); end for k=1:1:innum for j=1:1:midnum dw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4)); db1(j)=FI(j)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4)); end end w1=w1_1+xite*dw1'; b1=b1_1+xite*db1'; w2=w2_1+xite*dw2'; b2=b2_1+xite*db2'; w1_2=w1_1;w1_1=w1; w2_2=w2_1;w2_1=w2; b1_2=b1_1;b1_1=b1; b2_2=b2_1;b2_1=b2; end end %% 語音特徵訊號分類 inputn_test=mapminmax('apply',input_test,inputps); fore=zeros(4,500); for ii=1:1 for i=1:500%1500 %隱含層輸出 for j=1:1:midnum I(j)=inputn_test(:,i)'*w1(j,:)'+b1(j); Iout(j)=1/(1+exp(-I(j))); end fore(:,i)=w2'*Iout'+b2; end end %% 結果分析 %根據網路輸出找出資料屬於哪類 output_fore=zeros(1,500); for i=1:500 output_fore(i)=find(fore(:,i)==max(fore(:,i))); end %BP網路預測誤差 error=output_fore-output1(n(1501:2000))'; %畫出預測語音種類和實際語音種類的分類圖 figure(1) plot(output_fore,'r') hold on plot(output1(n(1501:2000))','b') legend('預測語音類別','實際語音類別') %畫出誤差圖 figure(2) plot(error) title('BP網路分類誤差','fontsize',12) xlabel('語音訊號','fontsize',12) ylabel('分類誤差','fontsize',12) %print -dtiff -r600 1-4 k=zeros(1,4); %找出判斷錯誤的分類屬於哪一類 for i=1:500 if error(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('正確率') disp(rightridio); </span>
呼叫函式版本:
%% 清空環境變數
clc
clear
%% 訓練資料預測資料提取及歸一化
%下載輸入輸出資料
load data input output
%從1到2000間隨機排序
k=rand(1,2000);
[m,n]=sort(k);
%找出訓練資料和預測資料
input_train=input(n(1:1900),:)';
output_train=output(n(1:1900));
input_test=input(n(1901:2000),:)';
output_test=output(n(1901:2000));
%選連樣本輸入輸出資料歸一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%% BP網路訓練
% %初始化網路結構
net=newff(inputn,outputn,5);
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00004;
%網路訓練
net=train(net,inputn,outputn);
%% BP網路預測
%預測資料歸一化
inputn_test=mapminmax('apply',input_test,inputps);
%網路預測輸出
an=sim(net,inputn_test);
%網路輸出反歸一化
BPoutput=mapminmax('reverse',an,outputps);
%% 結果分析
figure(1)
plot(BPoutput,':og')
hold on
plot(output_test,'-*');
legend('預測輸出','期望輸出')
title('BP網路預測輸出','fontsize',12)
ylabel('函式輸出','fontsize',12)
xlabel('樣本','fontsize',12)
%預測誤差
error=BPoutput-output_test;
figure(2)
plot(error,'-*')
title('BP網路預測誤差','fontsize',12)
ylabel('誤差','fontsize',12)
xlabel('樣本','fontsize',12)
figure(3)
plot((output_test-BPoutput)./BPoutput,'-*');
title('神經網路預測誤差百分比')
errorsum=sum(abs(error));
web browser www.matlabsky.com