BPニューラルネットワークの原理とプログラミングの実現
5036 ワード
1、bpニューラルネットワークの紹介は参考になる:http://wenku.baidu.com/view/174849da49649b6648d747dd.html?from=search/2、それからbpニューラルネットワークのプログラミング部分です.BPニューラルネットワーク予測の前に、まずネットワークが訓練を通じてネットワークに連想記憶と予測能力を持たせるように訓練しなければならない.BPニューラルネットワークの訓練過程は以下のいくつかのステップを含む.
具体的なプログラミング部分:%このコードはBPネットワークに基づく言語識別である
%%クリア環境変数clc clear
%%トレーニングデータ予測データの抽出と正規化
%4種類の音声信号load data 1 c 1 load data 2 c 2 load data 3 c 3 load data 4 c 4をダウンロード
%4つの特徴信号マトリクスは、1つのマトリクスdata(1:500,:)=c 1(1:500,:);data(501:1000,:)=c2(1:500,:); data(1001:1500,:)=c3(1:500,:); data(1501:2000,:)=c4(1:500,:);
%1から2000までのランダムソートk=rand(12000);[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),:)’;
%入力データ正規化[input,inputps]=mapminmax(input_train);
%%ネットワーク構造初期化innum=24;midnum=25; outnum=4;
%重み値w 1=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)’*w 1(j,:)’+b 1(j);Iout(j)=1/(1+exp(-I(j))); end%出力層出力yn=w 2’*Iout’+b 2;
以上から分かるように、暗黙層に入力される重み調整方式と暗黙層から出力される重み調整方式は異なるw 1_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%隠蔽層出力for j=1:1:midnum I(j)=inputn_test(:,i)’*w1(j,:)’+b1(j); Iout(j)=1/(1+exp(-I(j))); 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(output 1(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)となる.web browser www.matlabsky.com
具体的なプログラミング部分:%このコードはBPネットワークに基づく言語識別である
%%クリア環境変数clc clear
%%トレーニングデータ予測データの抽出と正規化
%4種類の音声信号load data 1 c 1 load data 2 c 2 load data 3 c 3 load data 4 c 4をダウンロード
%4つの特徴信号マトリクスは、1つのマトリクスdata(1:500,:)=c 1(1:500,:);data(501:1000,:)=c2(1:500,:); data(1001:1500,:)=c3(1:500,:); data(1501:2000,:)=c4(1:500,:);
%1から2000までのランダムソートk=rand(12000);[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),:)’;
%入力データ正規化[input,inputps]=mapminmax(input_train);
%%ネットワーク構造初期化innum=24;midnum=25; outnum=4;
%重み値w 1=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)’*w 1(j,:)’+b 1(j);Iout(j)=1/(1+exp(-I(j))); end%出力層出力yn=w 2’*Iout’+b 2;
%%
%
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';
以上から分かるように、暗黙層に入力される重み調整方式と暗黙層から出力される重み調整方式は異なるw 1_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%隠蔽層出力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(output 1(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)となる.web browser www.matlabsky.com