2014-05-13 111 views
-2

好吧,這裏是那麼整個代碼(在不同的語言,但..):Get方法

public class BackPropagation { 
    public double[][] targeti; 
    public double[][] ulazi; 
    public int brSlojeva; 
    Sloj[] slojevi; 
    public double minErr; 
    public double brzinaObucavanja; 
    public int maxBrEpoha; 


    BackPropagation(double[][] zadatiTargeti, double[][] zadatiUlazi, double zadataGreska, double zadataBrzinaObucavanja,int[] brNeuronaPoSlojevima,String[] zadateFcjeAktivacije, int zadatBrEpoha) 
    { 
     if((targeti.length>=0)&&(ulazi.length>=0)&&(ulazi.length==targeti.length)){ 
      targeti = new double[zadatiTargeti.length][zadatiTargeti[0].length]; 
      for(int i=0;i<targeti.length;i++) 
       for(int j=0;j<targeti[0].length;j++) 
        targeti[i][j] = zadatiTargeti[i][j]; 
      ulazi = new double[zadatiUlazi.length][zadatiUlazi[0].length]; 
      for(int i=0;i<ulazi.length;i++) 
       for(int j=0;j<ulazi[0].length;j++) 
        ulazi[i][j] = zadatiUlazi[i][j]; 
     } 
     else 
      System.out.println("Broj treninga i broj ulaza mora biti jednak, i veci od nule!");  
     if(brNeuronaPoSlojevima.length>0){ 
      brSlojeva = brNeuronaPoSlojevima.length; 
      slojevi = new Sloj[brNeuronaPoSlojevima.length]; 
      slojevi[0] = new Sloj(zadatiUlazi[0].length,brNeuronaPoSlojevima[0],zadateFcjeAktivacije[0]); 
     for(int i=1;i<brNeuronaPoSlojevima.length;i++) 
      slojevi[i] = new Sloj(brNeuronaPoSlojevima[i-1],brNeuronaPoSlojevima[i],zadateFcjeAktivacije[i]); 
     } 
     else 
      System.out.println("Mora postojati bar jedan sloj! Unesite vrednost vecu od nule.");   
     brzinaObucavanja = zadataBrzinaObucavanja; 
     minErr = zadataGreska; 
     maxBrEpoha = zadatBrEpoha; 
     public int getBrSlojeva (int[] brNeuronaPoSlojevima){ 
      return brNeuronaPoSlojevima.length; 
     } 
    } 


    public void Treniraj() 
    { 
     int brEpoha=0; 
     double ukupnaGreska; 
     do{ 
      ukupnaGreska =0; 
      for(int i=0;i<ulazi.length;i++) 
      { 
       slojevi[0].setUlazi(ulazi[i]); 

       RacunanjeIzlazaSlojeva(); 
       for(int j=0;j<slojevi[brSlojeva-1].neuroni.length;j++) 
        ukupnaGreska+=Math.pow(targeti[i][j]-slojevi[brSlojeva-1].neuroni[j].izlaz, 2); // treba da pise slojevi od brSlojeva-1 jer nam trebaju izlazi iz neuronske mreze, a oni su u poslednjem sloju 

       RacunanjeDelteNeurona(i); 

       AzuriranjeTezinaIBijasa(); 
      } 
      brEpoha++; 
      ukupnaGreska/=2; 
     }while(brEpoha<maxBrEpoha && ukupnaGreska>minErr); 
    } 





    private void RacunanjeIzlazaSlojeva() 
    { 
     for(int i =0;i<brSlojeva;i++) 
     { 
      slojevi[i].IzracunajIzlazeNeurona(); 
      if(i<brSlojeva-1) 
       slojevi[i+1].setUlazi(slojevi[i].VratiIzlazeSloja()); 
     } 
    } 

    private void RacunanjeDelteNeurona(int brTreninga) 
    { 
     double suma = 0; 
     for(int i=0;i<slojevi[brSlojeva-1].neuroni.length;i++) 
      slojevi[brSlojeva-1].neuroni[i].setSignalError((targeti[brTreninga][i]-slojevi[brSlojeva-1].neuroni[i].izlaz)*slojevi[brSlojeva-1].IzvodFcjeAktivacije(slojevi[brSlojeva-1].neuroni[i].izlaz)); 
     for(int i=brSlojeva-2;i>=0;i--) 
     { 
      for(int j=0;j<slojevi[i].neuroni.length;j++) 
      { 
       suma = 0; 
       for(int k=0;k<slojevi[i+1].neuroni.length;k++) 
       { 
        suma += slojevi[i+1].neuroni[k].getSignalError()*slojevi[i+1].neuroni[k].tezine[j]; 
       } 
       slojevi[i].neuroni[j].setSignalError(suma*slojevi[i].IzvodFcjeAktivacije(slojevi[i].neuroni[j].izlaz)); 
      } 
     } 


    } 

    private void AzuriranjeTezinaIBijasa() 
    { 
     for(int i=0;i<slojevi.length;i++) 
     { 
      for(int j=0;j<slojevi[i].neuroni.length;j++) 
      { 
       for(int k=0;k<slojevi[i].getUlazi().length;k++) 
        slojevi[i].neuroni[j].tezine[k] = slojevi[i].neuroni[j].tezine[k] + brzinaObucavanja*slojevi[i].neuroni[j].getSignalError()*slojevi[i].getUlazi()[k]; 
       slojevi[i].neuroni[j].setBijas(slojevi[i].neuroni[j].getBijas() + brzinaObucavanja * slojevi[i].neuroni[j].getSignalError()); 
      } 
     } 
    } 
} 

這是IM想什麼來擺脫public int brSlojeva; 就像你看到的,這是brSlojeva使用無處不在的構造函數,問題是,如何擺脫它,但使用brNeuronaPoSlojevima,如果它的值只在構造函數中可見的值..

+0

你在班上有一個int [] numNeuronsPerLayer'字段嗎? –

+1

用完整的代碼示例回答您的問題會更容易。請將您的代碼作爲一個[最小示例](http://stackoverflow.com/help/mcve)來演示您的問題。 –

+0

這是非常複雜的代碼(神經網絡),並且變量不是英文的,在最小的例子中需要花費很多時間來重建代碼,而我沒有那個時間。有點急。如果你覺得你有足夠的時間,我可以給你發郵件。 –

回答

1

這個類的設計似乎有問題,我不知道爲什麼需要刪除numLayers實例變量。

至於編譯器錯誤,你的方法需要知道什麼numNeuronsPerLayer是。由於它不是一個實例變量,唯一的選擇就是在把它作爲一個參數,與你的構造:

public int getNumLayers(int[] numNeuronsPerLayer) { 
    return numNeuronsPerLayer.length; 
} 

而且這種方法定義無法你的構造函數中存在。

此外,這不是一個非常有用的方法,只是返回一個數組的長度。任何這種方法的調用者會更好地直接訪問其數組的屬性length

+0

或者'numNeuronsPerLayer'可以保存爲一個類變量。這取決於這個班級背後的想法是什麼。 – blalasaadri

+0

@blalasaadri OP _was_將該值保存到'numLayers'實例變量,但由於某種原因被告知將其刪除。 – GriffeyDog

+0

numLayers變量,是的。不是'numNeuronsPerLayer'。正如我所說,這很大程度上取決於班級應該做什麼。 – blalasaadri

0

如果我弄對了,那麼brSlojeva的長度爲brNeuronaPoSlojevima。 在構造函數中,你有slojevi = new Sloj[brNeuronaPoSlojevima.length];,所以它的意思是,Sloj[] slojevi;的長度與brNeuronaPoSlojevima的長度相同,因此public int brSlojeva;與表達式slojevi.length的值相同。從字段中刪除brSlojeva,並用slojevi.length的方法替換它。這應該工作。

也擺脫

public int getBrSlojeva (int[] brNeuronaPoSlojevima){ 
      return brNeuronaPoSlojevima.length; 
     } 

有像在構造函數中定義方法沒有這樣的事情。我知道你在期待什麼,但這種事情根本不可能。

PS。在java方法中,名字應該以小寫字母開頭。