全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1421
推到 Plurk!
推到 Facebook!

初学网络神络方面的知识,无头序,下了一段源码无法看懂,希望前辈们帮帮忙

答題得分者是:pgdennis
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-10 18:54:29 IP:218.59.xxx.xxx 訂閱
东西有点多,刚才发在这上面,看着实在是不方便,
{}中的注释是原有的 其它的是我加入的 但还是无法理解全部,有懂的前辈是否能帮忙解析一下?

<textarea class="delphi" rows="10" cols="60" name="code">unit Unit1; { 写人脸检测程序的时候顺带写的,网络格式是靠读入一个文件定义的, 文件的格式如下: 输入图像长 输入图像宽 隐层神经元个数 输出神经元个数 不同网络结构数量 [连接位置不同的隐层神经元的个数 连接的隐层神经元个数] [隐层神经元连接的输入神经元的位置表] } interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TSingleExtendedArray = array of extended; TDoubleExtendedArray = array of array of extended; TSamples = packed record Ins: TSingleExtendedArray; Outs: TSingleExtendedArray; end; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; Memo1: TMemo; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private procedure BackPropagate(t: TSingleExtendedArray; n, m: extended); function UpDate(inputs: TSingleExtendedArray): extended; public samplecounts, TestCounts: longint; procedure AddToTrain(Ins, Outs: TSingleExtendedArray); procedure AddToTest(Ins, Outs: TSingleExtendedArray); procedure SaveToFile(FileName: string); procedure LoadFromFile(FileName: string); procedure Train(n, m: extended); function Init(FileName: string): boolean; function Predict(Ins: TSingleExtendedArray): extended; function Test: extended; destructor Destroy; override; private nI, nH, nO: longint; aI, aH, aO, Output_Deltas, Hidden_Deltas: TSingleExtendedArray; wI, wO, cI, cO: TDoubleExtendedArray; Connections: array of array of boolean; Samples: array of TSamples; TestSet: array of TSamples; end; var Form1: TForm1; sFileName: string; //文件名 sOrcFileName: string; //特征库文件名 implementation {$R *.dfm} //初始化文件(记录文件) function TForm1.Init(FileName: string): boolean; var i, j, k, fi, fj: longint; nIw, nIh, RopMax, RopNum, RopTypes: longint; RopMap: array of longint; begin AssignFile(Input, FileName); ReSet(Input); Readln(Input, nIw, nIh, nH, nO); nI := nIw * nIh; setlength(aI, nI); setlength(aH, nH); setlength(aO, nO); for i := 0 to nI - 1 do aI[i] := 1; for i := 0 to nH - 1 do aH[i] := 1; for i := 0 to nO - 1 do aO[i] := 1; setlength(wI, nI, nH); setlength(wO, nH, nO); setlength(cI, nI, nH); setlength(cO, nH, nO); setlength(Connections, nI, nH); for i := 0 to nI - 1 do for j := 0 to nH - 1 do Connections[i, j] := False; Readln(RopTypes); fj := 0; for k := 1 to RopTypes do begin Readln(RopMax, RopNum); setlength(RopMap, nI); fi := 0; for i := 1 to nIh do begin for j := 1 to nIw do begin Read(RopMap[fi]); Inc(fi); end; Readln; end; fi := 0; for i := 1 to RopNum do begin Inc(fi); if fi > RopMax then fi := 1; for j := 0 to nI - 1 do if RopMap[j] = fi then Connections[j, fj] := true; Inc(fj); end; end; setlength(Output_Deltas, nO); setlength(Hidden_Deltas, nH); randomize; for i := 0 to nI - 1 do for j := 0 to nH - 1 do begin cI[i, j] := 0; wI[i, j] := random(40000) / 10000 - 2; end; for i := 0 to nH - 1 do for j := 0 to nO - 1 do begin cO[i, j] := 0; wO[i, j] := random(40000) / 10000 - 2; end; setlength(Samples, $100); setlength(TestSet, $100); samplecounts := 0; TestCounts := 0; CloseFile(Input); end; procedure TForm1.BackPropagate(t: TSingleExtendedArray; n, m: extended); var i, j, k: longint; Sum, Change: extended; begin for i := 0 to nO - 1 do Output_Deltas[i] := aO[i] * (1 - aO[i]) * (t[i] - aO[i]); for j := 0 to nH - 1 do begin Sum := 0; for k := 0 to nO - 1 do Sum := Sum Output_Deltas[k] * wO[j, k]; Hidden_Deltas[j] := aH[j] * (1 - aH[j]) * Sum; end; for j := 0 to nH - 1 do for k := 0 to nO - 1 do begin Change := Output_Deltas[k] * aH[j]; wO[j, k] := wO[j, k] n * Change m * cO[j, k]; cO[j, 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 TForm1.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 TForm1.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 TForm1.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 TForm1.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 TForm1.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 TForm1.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 TForm1.Predict(Ins: TSingleExtendedArray): extended; begin try Predict := UpDate(Ins); except Predict := 0; end; end; function TForm1.Test: extended; var PreRet, m: extended; i, Counts, Ret: longint; begin Counts := 0; m := 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; if Counts > 0 then m := Counts / TestCounts; Result := m; end; destructor TForm1.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; {=========================================================} procedure TForm1.Button1Click(Sender: TObject); var sName: string; m: extended; begin if OpenDialog1.Execute then sName := OpenDialog1.FileName else Exit; if sName = '' then Exit; Init(sName); end; //载入图片 procedure TForm1.Button2Click(Sender: TObject); var s: string; begin if OpenDialog1.Execute then s := OpenDialog1.FileName else Exit; if s <> '' then sFileName := s else Exit; LoadFromFile(s); end; //保存图片 procedure TForm1.Button3Click(Sender: TObject); begin if sFileName <> '' then SaveToFile(sFileName); end; end. </textarea>
編輯記錄
lonmener 重新編輯於 2007-06-10 18:56:23, 註解 無‧
lonmener 重新編輯於 2007-06-10 18:57:13, 註解 無‧
lonmener 重新編輯於 2007-06-10 19:13:04, 註解 無‧
lonmener 重新編輯於 2007-06-10 19:14:08, 註解 無‧
lonmener 重新編輯於 2007-06-10 19:51:50, 註解 無‧
lonmener 重新編輯於 2007-06-11 23:09:12, 註解 無‧
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-11 10:34:10 IP:59.120.xxx.xxx 未訂閱
問問題請勿以"全看不懂","沒有頭緒"這種表達方式,然後PO一段程式碼請大家看

你的問題不在於程式,請先把累神經網路的演算法弄懂,

程式內的Procedure命名大致就是累神經網路的演算法的步驟
------
星期一,二...無窮迴圈@@
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-11 23:08:37 IP:218.59.xxx.xxx 訂閱
谢谢指点
系統時間:2024-06-26 22:26:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!