好吧,這裏是那麼整個代碼(在不同的語言,但..):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
,如果它的值只在構造函數中可見的值..
你在班上有一個int [] numNeuronsPerLayer'字段嗎? –
用完整的代碼示例回答您的問題會更容易。請將您的代碼作爲一個[最小示例](http://stackoverflow.com/help/mcve)來演示您的問題。 –
這是非常複雜的代碼(神經網絡),並且變量不是英文的,在最小的例子中需要花費很多時間來重建代碼,而我沒有那個時間。有點急。如果你覺得你有足夠的時間,我可以給你發郵件。 –