2011-11-14 9 views
0

私はMATLABの初心者です.Cのオンラインバックプロパゲーション(BP)コードを確認したいのですが、コードが同じネットワーク設定で正確に同じかどうかをテストする必要があります。ネットワーク設定は、元のBP(XOR問題の場合)2入力、2隠れノード、1出力です。使用される学習率設定は0.01、運動量0.95であり、停止基準は0.01であり、性能指標はsseである。エポックが を(私は後方に伝播するように前方に伝播から正確に計算を確認したいので、Cと全く同じネットワーク設定を確認するために)1であるここに私のコードです:実行後ニューラルネットで起こることMatlabのバックプロパゲーション

clear all;clc 
    input = [0 0; 0 1; 1 0; 1 1]'; 
    target = [0 1 1 0]; % p = [-1 -1 2 2; 0 5 0 5]; % t = [-1 -1 1 1]; 
    state0 = 1367; 
    rand('state',state0) 
    net = newff(input,target,2,{},'traingd'); 
    net.divideFcn = ''; 

    %set max epoh, goal, learning rate, show stp 
    net.trainParam.epochs  =1; 
    net.trainParam.goal  = 0.01; 
    net.performFcn ='sse'; 
    net.trainParam.lr   = 0.01; 
    net.adaptFcn=' '; 

    net.trainParam.show  = 100; 
    net.trainparam.mc   = 0.95; 
    net.layers{1}.transferFcn = 'logsig'; 
    net.layers{2}.transferFcn = 'logsig'; 

    wih  = net.IW{1,1}; 
    wihb= net.b{1,1}; 
    who = net.LW{2,1}; 
    whob = net.b{2,1}; 

    %Train 
    net = train(net,input,target); %adapt 
    y= sim(net,input); 
    e=target-y; 
    perf = sse(e) 

、私は0.609299823823181 あるマニュアルのカウントと異なるyが(1)0.818483286935909 であることがわかりました(私は計算によって再確認==>

for i=1:size(input,2) 
hidden(1) = logsig(wih (1)*input(1) + wih(2)*input(2) + wihb(1)); 
hidden(2) = logsig(wih (3)*input(1) + wih(4)*input(2) + wihb(2)); 
out(i) = logsig(hidden(1)*who(1) + hidden(2)*who(2) + whob(1));end ) 

私の質問は次のとおりです。 1)オリジナルのMATLABがあるさtraingdを使って? 2)実際には何か net = train(net、input、target); y = sim(ネット、入力)。列車とシムを使用して手動計算で0.818483286935909ではなく0.609299823823181が得られた場合はどこに行ってください。

3)上記のようなMATLABコードと比較して、Cでの私の粗い順方向伝搬とは何が違うのですか?

お願いします。

答えて

0

1)Matlabsの "train"コマンドは、オンラインではなくバッチラーニングを使用すると信じています。おそらく、あなたはMatlabのオンライン学習のための "適応"機能を調べるべきですが、それが良いかどうかはわかりません。 train()とtraingd()が実際に同じメソッドであるかどうかを尋ねていますか、列車でもgradient-descentを使用しているかどうか尋ねていますか?

2)Matlabのヘルプには、「通常、トレーニングの1つのエポックは、ネットワークへのすべての入力ベクトルの単一のプレゼンテーションとして定義されます。ネットワークは、それらのプレゼンテーションの結果に従って更新されます。

これは、列車がバックプロパゲーションしてネットワークを1回訓練し、次にこの訓練されたネットワークに基づいて回答をシミュレートすることを意味します。

3)ここにCコードはすべてあなたのプログラムのコードですか?もしそうなら、あなたのCコードはフィードフォワードしか見えないのに対し、Matlabは一度重みを更新してからフィードフォワードするという違いがあると思いますか?または、私は何かを逃したことがありますか/何かを残しましたか?私はすべて正しくご質問を理解している

希望は、彼らが

+0

2)私は、バッチトレーニングを使用してtraingd信じる(newff initとREINIT活性化機能の間に)異なる重みを初期化し、私はnewff機能を推測、私は機能を適応させる見ている、ニクラスに感謝。私はI = 1をチェック場合:サイズ(入力、2) 隠された(1)= logsig(WIH(1)*入力(1)+ WIH(2)*入力(2)+ wihb(1))。 隠された(2)= logsig(WIH(3)*入力(1)+ WIH(4)*入力(2)+ wihb(2))。アウト (I)= logsig(隠された(1)*(1)+隠された(2)*(2)+ whob(1)); END)3)Cコード以下同様 –

0

はニクラスに感謝し、私は機能を適応させる見てきました、私は別の初期化newff機能を推測..私は間違って何か得た場合の回では不明ビットは、コメントしてくださいました(newff initおよびreinit活性化機能中)

2)私はまた、バッチトレーニングを使用してtraingdを信じています。私は、出力チェックしたけど:ちょうど

for i=1:size(input,2) 
    hidden(1) = logsig(wih (1)*input(1) + wih(2)*input(2) + wihb(1)); 
    hidden(2) = logsig(wih (3)*input(1) + wih(4)*input(2) + wihb(2)); 
    out(i) = logsig(hidden(1)*who(1) + hidden(2)*who(2) + whob(1)); 
end 

3)Cのコードを次のように

void forwardPropagate(double *Input) 
{ 
    int i,j,k; 
    double sumIH=0.0,sumHO=0.0; 

for(j=0; j< numHid; j++) 
{ 
    for(i=0; i<numInput; i++) //numInput+1 
    {  // 
     sumIH+=Input[i] * wtIH[j][i]; 
    } 
    sumIH+=(1.0 * wtIH[j][numInput]); 
    Hidden[j]=sigmoid(sumIH);   
}  


    for(k = 0 ; k< numOutput ; k++) 
{ 
    for(j =0 ; j <numHid ; j++) //numHid+1 
    { 
     sumHO+=Hidden[j] * wtHO[k][j];   
    } 
    sumHO+=(1.0 * wtHO[k][numHid]); 
    Output[k]=sigmoid(sumHO); 
} 
} 


void backPropagate (double *target) 
{ 
    int j,k; 
    double sumOutErr, desired[numOutput]; 

    for(k = 0 ; k<numOutput ; k++) 
    { 
    desired[k]=target[k]; 
     error[k]=desired[k]-Output[k];  
    deltaOutput[k]=beta *(Output[k] * (1 - Output[k]))*(error[k]); 
    } 

for(j =0 ; j <numHid; j++) 
{  
    sumOutErr= 0.0 ;  
    for(k = 0 ; k < numOutput ; k++)  
    { 
     sumOutErr+= wtHO[k][j] * deltaOutput[k] ;   
    } 
    deltaHidden[j] = beta* sumOutErr * Hidden[j] * (1.0 - Hidden[j]); 
    } 
}  


void weight_changes(double *test_pat){ 

int h,i,j,k; 

for(k = 0 ; k < numOutput ; k ++) { // update weights WeightHO   

    for(j = 0 ; j < numHid ; j++) { //asal numHid+1;  


     delta_wtHO[k][j]= alpha * Hidden[j]*deltaOutput[k] + 
         M*delta_wtHO[k][j]; 
     wtHO[k][j] += delta_wtHO[k][j]; 

    }//bias 
    delta_wtHO[k][numHid]= alpha * 1.0 *deltaOutput[k] + M*delta_wtHO[k]' 
      [numHid]; 
    wtHO[k][numHid] += delta_wtHO[k][numHid]; 
} 

for(h = 0 ; h < numHid ; h++) {  // update weights WeightIH     
    for(i = 0 ; i < numInput ; i++) { //asal numInput+1 

     delta_wtIH[h][i] =alpha * test_pat[i] *    
         deltaHidden[h]+M*delta_wtIH[h][i]; 
     wtIH[h][i] += delta_wtIH[h][i] ; 

    } //bias 
    delta_wtIH[h][numInput] =alpha * 1.0 * deltaHidden[h]+M*delta_wtIH[h] 
        [numInput]; 
    wtIH[h][numInput] += delta_wtIH[h][numInput] ; 
} 
    } 

感謝を。

関連する問題