2011-11-14 90 views
0

我是MATLAB新手,我想驗證在C中的在線反傳(BP)代碼。我需要測試代碼是否與完全相同的網絡設置相同。網絡設置是原始BP(針對異或問題)2個輸入,2個隱藏節點和1個輸出。使用的學習速率設置爲0.01,動量爲0.95,停止標準爲0.01,性能測量爲sse。曆元爲1(因爲我想檢查從正向傳播到向後傳播準確計算,以便驗證網絡恰好設置一樣C) 這裏是我的代碼:在神經網絡中發生了什麼神經網絡中的反向傳播在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) 

運行之後,我發現,在Y(1)是0.818483286935909 它是由人工計數不同的是0.609299823823181 (我通過複覈計算==>

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(net,input);使用train和sim進行手動計算導致0.609299823823181而不是0.818483286935909。

3)與上面的matlab代碼相比,C中的粗前向傳播有什麼不同?

請幫助我。

回答

0

1)我相信Matlabs的「火車」命令使用批量學習,而不是在線。也許你應該看看Matlab的在線培訓中的「適應」功能,不知道它是否有用。你問火車()和traingd()是否實際上是相同的方法,或者你問火車是否也使用梯度下降?

2)Matlab的幫助說:「通常,一個訓練時期被定義爲網絡中所有輸入向量的一次展示,然後根據所有演示結果更新網絡。

我想這意味着列車會反向傳播和「訓練」網絡一次,然後您根據這個訓練的網絡模擬答案。

3)這裏列出的C代碼是你程序中的所有代碼嗎?如果是這樣,我想不同的是,Matlab更新權重一次,然後前饋,而你的C代碼似乎只是前饋?或者我錯過了什麼/你遺漏了什麼?

希望我理解正確的話你所有的問題,他們是有點不清楚的時候,請評論,如果我有什麼不對..

+0

感謝Niclas,我看過適應函數,我猜newff函數初始化不同的權重(在newff init和reinit激活函數期間)2)我也相信使用批量訓練進行traingd。 (1)*輸入(1)+ wih(2)*輸入(2)+ wihb(1));但是當我檢查i = 1:size(輸入,2) hidden(1)= logsig(wih (2)= logig(wih(3)* input(1)+ wih(4)* input(2)+ wihb(2)); (1)* who(1)+ hidden(2)* who(2)+ whob(1)); end)3)C代碼如下 –

0

感謝尼克拉斯,我所看到的適應功能,我想newff函數初始化不同體重(newff init和reinit激活功能期間)

2)我也相信使用批量訓練進行訓練。但是,當我檢查的輸出:

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] ; 
} 
    } 

感謝。

相關問題