Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- procedure fnProsesTrain;
- var ii, jj, kk, nn, i, xx: integer;
- CT, Y2, net, D2, deltaB2, MSEchek, tempY2: Double;
- error, sumError, PE, sumPE, MAPE, aa, bb: Double;
- CP, Y1, D1, deltaW1, deltaW2, deltaB1, D1_net, tempNet: array of array of Double;
- Baris, Kolom: Word;
- themp: array of array of Double;
- jmlParam : Integer;
- begin
- sTrain := True;
- sSave := False;
- try
- targetErr := StrToFloatDef(FTrain.edTargetError.Text, 0.0000001);
- alfa := StrToFloatDef(FTrain.edLearningRate.Text, 0);
- maxEpoch := StrToIntDef(FTrain.edEpoch.Text, 0);
- kolTarget := nodeInput + 1;
- fnSetBobot;
- sumError := 0;
- MSEchek := 1;
- Epoch := 0;
- SetLength(MSE, 1, maxEpoch + 1);
- SetLength(Y2akhir, tLatih, 2);
- SetLength(tempArrYAkhir, tLatih, 2);
- TThread.Synchronize(nil, procedure begin
- FTrain.pbTrain.Max := maxEpoch;
- FTrain.pbTrain.Min := 0;
- FTrain.pbTrain.Value := 0;
- FTrain.tiPrintData.Enabled := True;
- FTrain.tiAutoSave.Enabled := True;
- end);
- while (Epoch < maxEpoch) do begin
- if (MSEchek > targetErr) then begin
- Inc(Epoch);
- errTrain := 0;
- for kk := 0 to tLatih - 1 do begin
- SetLength(CP, 1, nodeInput);
- for Kolom := 0 to nodeInput - 1 do
- CP[0, Kolom]:= DtLatihNorm[kk, Kolom];
- CT := DtLatihNorm[kk, kolTarget - 1];
- SetLength(themp, 1, nodeInput);
- SetLength(Y1, 1, nodeHidden);
- for ii:= 0 to nodeHidden - 1 do begin
- net:= 0;
- for kolom:= 0 to nodeInput - 1 do begin
- themp[0, Kolom] := CP[0, Kolom] * w1[ii, Kolom];
- net := net + themp[0, Kolom];
- end;
- net:= net + b1[ii, 0];
- Y1[0, ii] := Sigmoid(net);
- end;
- SetLength(themp, 1, nodeHidden);
- for ii:= 0 to nodeOutput - 1 do begin
- net:= 0;
- for Kolom := 0 to nodeHidden - 1 do begin
- themp[0, Kolom] := Y1[0, Kolom] * w2[ii, Kolom];
- net := net + themp[0, Kolom];
- end;
- net:= net + b2;
- Y2 := Sigmoid(net);
- end;
- Y2akhir[kk, 0] := CT;
- Y2akhir[kk, 1] := Y2;
- //menghitung error training
- error:= CT - Y2;
- //menghitung rata-rata error dari semua node per epoch
- sumError := sum(error);
- errTrain:= errTrain + sqr(sumError/1);
- //menghitung faktor koreksi pada tiap neuron di output //turunan
- D2:= error * Y2 * (1 - Y2); //sigmoid
- //menghitung delta w2
- SetLength(deltaW2, nodeOutput, nodeHidden);
- for jj:= 0 to nodeHidden-1 do begin
- for nn:= 0 to nodeOutput-1 do begin
- deltaW2[nn, jj]:= alfa * (D2 * Y1[0,jj]);
- end;
- end;
- //menghitung delta b2
- for nn:= 0 to nodeOutput-1 do begin
- deltaB2:= alfa * D2;
- end;
- //menghitung faktor koreksi pada tiap neuron di hidden
- SetLength(D1_net, 1, nodeHidden);
- SetLength(D1, 1, nodeHidden);
- for jj:= 0 to nodeHidden-1 do begin
- D1_net[0, jj]:= D2 * w2[0,jj];
- end;
- for Kolom:= 0 to nodeHidden-1 do //turunan
- D1[0, kolom]:= D1_net[0, Kolom] * Y1[0, Kolom] * (1-Y1[0, Kolom]);
- //menghitung delta w1
- SetLength(deltaW1, nodeHidden, nodeInput);
- for jj:= 0 to nodeInput-1 do begin
- for nn:=0 to nodeHidden-1 do begin
- deltaW1[nn, jj]:= alfa * (D1[0, nn] * CP[0, jj]);
- end;
- end;
- //menghitung delta b1
- SetLength(deltaB1, nodeHidden, 1);
- for nn:= 0 to nodeHidden-1 do begin
- deltaB1[nn, 0] := alfa * D1[0, nn];
- end;
- //update semua bobot dan bias
- for Baris:= 0 to nodeHidden-1 do
- for Kolom:= 0 to nodeInput-1 do
- w1[Baris, Kolom] := w1[Baris, Kolom] + deltaW1[Baris, Kolom];
- for Baris:= 0 to nodeOutput-1 do
- for Kolom:= 0 to nodeHidden-1 do
- w2[Baris, Kolom] := w2[Baris, Kolom] + deltaW2[Baris, Kolom];
- for Baris:= 0 to nodeHidden-1 do
- for Kolom:= 0 to nodeOutput-1 do
- b1[Baris, Kolom] := b1[Baris, Kolom] + deltaB1[Baris, Kolom];
- b2:= b2 + deltaB2;
- end;
- //SetLength(MSE, 1, maxEpoch + 1);
- MSE[0, Epoch-1]:= (errTrain / tLatih);
- MSEchek:= errTrain / tLatih;
- MSEterakhir:= MSE[0, Epoch-1];
- if sAutoSave then
- fnSimpanParameter;
- if not sTrain then
- Break;
- end else begin
- Break;
- end;
- end;
- finally
- sTrain := False;
- TThread.Synchronize(nil, procedure begin
- fnHasilTrain;
- fnProsesTest;
- fnHasilTest;
- if FTrain.cbSimpanBerkala.IsChecked then
- fnSimpanParameter;
- FTrain.btnSimpan.Enabled := True;
- FTrain.btnProses.Enabled := True;
- FTrain.btnProsesData.Enabled := True;
- FTrain.fnSetEnabledInput(True);
- FTrain.tiPrintData.Enabled := False;
- FTrain.tiAutoSave.Enabled := False;
- FTrain.pbTrain.Value := Epoch;
- FTrain.lblEpoch.Text := Epoch.ToString + ' / ' + maxEpoch.ToString;
- end);
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement