k] := Change; end; for i := 0 to nI - 1 do for j := 0 to nH - 1 do if Connections[i, j] then begin Change := Hidden_Deltas[j] * aI[i]; wI[i, j] := wI[i, j] + n * Change + m * cI[i, j]; cI[i, j] := Change; end; end; function TGraphicBpnn.UpDate(inputs: TSingleExtendedArray): extended; var i, j, k: Longint; Sum: extended; begin for i := 0 to nI - 1 do aI[i] := Inputs[i]; for j := 0 to nH - 1 do begin Sum := 0; for i := 0 to nI - 1 do if Connections[i, j] then Sum := Sum + aI[i] * wI[i, j]; aH[j] := 1 / (1 + Exp(-Sum)); end; for k := 0 to nO - 1 do begin Sum := 0; for j := 0 to nH - 1 do Sum := Sum + aH[j] * wO[j, k]; aO[k] := 1 / (1 + Exp(-Sum)); end; UpDate := aO[0]; end; procedure TGraphicBpnn.Train(n, m: extended); var i: Longint; begin for i := 0 to samplecounts - 1 do begin UpDate(Samples[i].Ins); BackPropagate(Samples[i].Outs, n, m); end; end; procedure TGraphicBpnn.AddToTrain(Ins, Outs: TSingleExtendedArray); var i: longint; begin if samplecounts > High(Samples) then setlength(Samples, samplecounts + $100); setlength(Samples[samplecounts].Ins, nI); setlength(Samples[samplecounts].Outs, nO); for i := 0 to nI - 1 do Samples[samplecounts].Ins[i] := Ins[i]; for i := 0 to nO - 1 do Samples[samplecounts].Outs[i] := Outs[i]; Inc(samplecounts); end; procedure TGraphicBpnn.AddToTest(Ins, Outs: TSingleExtendedArray); var i: longint; begin if TestCounts > High(TestSet) then setlength(TestSet, TestCounts + $100); setlength(TestSet[TestCounts].Ins, nI); setlength(TestSet[TestCounts].Outs, nO); for i := 0 to nI - 1 do TestSet[TestCounts].Ins[i] := Ins[i]; for i := 0 to nO - 1 do TestSet[TestCounts].Outs[i] := Outs[i]; Inc(TestCounts); end; procedure TGraphicBpnn.SaveToFile(FileName: string); var i, j, k: longint; SaveStream: TMemoryStream; begin SaveStream := TMemoryStream.Create; SaveStream.Seek(0, 0); for i := 0 to nI - 1 do for j := 0 to nH - 1 do begin SaveStream.Write(wI[i, j], sizeof(wI[i, j])); SaveStream.Write(cI[i, j], sizeof(cI[i, j])); end; for j := 0 to nH - 1 do for k := 0 to nO - 1 do begin SaveStream.Write(wO[j, k], sizeof(wO[j, k])); SaveStream.Write(cO[j, k], sizeof(cO[j, k])); end; SaveStream.SaveToFile(FileName); SaveStream.Free; end; procedure TGraphicBpnn.LoadFromFile(FileName: string); var i, j, k: longint; ReadStream: TMemoryStream; begin ReadStream := TMemoryStream.Create; ReadStream.LoadFromFile(FileName); ReadStream.Seek(0, 0); for i := 0 to nI - 1 do for j := 0 to nH - 1 do begin ReadStream.Read(wI[i, j], sizeof(wI[i, j])); ReadStream.Read(cI[i, j], sizeof(cI[i, j])); end; for j := 0 to nH - 1 do for k := 0 to nO - 1 do begin ReadStream.Read(wO[j, k], sizeof(wO[j, k])); ReadStream.Read(cO[j, k], sizeof(cO[j, k])); end; ReadStream.Free; end; function TGraphicBpnn.Predict(Ins: TSingleExtendedArray): extended; begin try Predict := Update(Ins); except Predict := 0; end; end; function TGraphicBpnn.Test: extended; var PreRet: extended; i, Counts, Ret: longint; begin Counts := 0; for i := 0 to TestCounts - 1 do begin PreRet := Predict(TestSet[i].Ins); if PreRet > 0.5 then Ret := 1 else Ret := 0; if Ret = TestSet[i].Outs[0] then Inc(Counts); end; Result := Counts / TestCounts; end; destructor TGraphicBpnn.Destroy; begin setlength(aI, 0); setlength(aH, 0); setlength(aO, 0); setlength(Output_Deltas, 0); setlength(Hidden_Deltas, 0); setlength(wI, 0, 0); setlength(wO, 0, 0); setlength(cI, 0, 0); setlength(cO, 0, 0); setlength(Connections, 0, 0); setlength(Samples, 0); inherited; end;
上一页 [1] [2] |