2つの1桁の整数の足し算をFANN(Fast Artificial Neural Network Library)に行わせる(ディープラーニング) ~Delphiでお手軽プログラミング
FANNを使用する為のファイルの準備
https://mam-mam.net/delphi/fann.html からfannfloat.dll、fann.pas、MamFann.pasをダウンロードする。Delphiを起動して新規作成を行う
Delphi起動⇒ファイル⇒新規作成⇒WindowsVCLアプリケーション を選択します。TButton 2個、TSpinEdit 2個、TImage、TLabel4つをフォームへドラッグ&ドロップします。
ソースコードを記述する
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Samples.Spin fann, MamFann; type TForm1 = class(TForm) Label1: TLabel; Image1: TImage; Button1: TButton; Button2: TButton; SpinEdit1: TSpinEdit; SpinEdit2: TSpinEdit; Label2: TLabel; Label3: TLabel; Label4: TLabel; procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } MamFann: TMamFann; public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var NeuronNumInLayer:array of Cardinal; inputs: array [0..1] of TFann_type; outputs: array [0..0] of TFann_type; epoch:Integer; //一連の学習の実施回数 i,j:integer; begin //TMamFannクラスのインスタンス化 if not Assigned(MamFann) then begin //1+1を入力層とする setlength(NeuronNumInLayer,4); NeuronNumInLayer[0]:=2; //入力層のニューロン数 NeuronNumInLayer[1]:=5; //中間層のニューロン数 NeuronNumInLayer[2]:=2; //中間層のニューロン数 NeuronNumInLayer[3]:=1; //出力層のニューロン数 MamFann:=TMamFann.Create(NeuronNumInLayer); end; //1桁の整数+1桁の整数を学習する for epoch := 1 to 30000 do begin for i := 0 to 10 do begin for j := 0 to 10 do begin inputs[0]:=i/10; inputs[1]:=j/10; outputs[0]:=(i+j)/20; MamFann.Train(inputs,outputs); end; end; end; //誤差分散を表示 label1.caption:=Format('%9.7f',[MamFann.GetMSE]); //ニューロン図の表示 Image1.Proportional:=True; Image1.Stretch:=True; MamFann.CreateNeuronBmp(Image1.Picture.Bitmap); end; // procedure TForm1.Button2Click(Sender: TObject); var inputs : array [0..1] of TFann_type; outputs: array [0..0] of TFann_type; begin if not Assigned(MamFann) then exit; inputs[0]:=strtofloat(SpinEdit1.Text)/10; inputs[1]:=strtofloat(SpinEdit2.Text)/10; MamFann.Run(inputs,outputs); //AI(FANN)が2つの数字を足した値を表示する Label4.Caption:=FloatToStr(round( (outputs[0])*20)); end; procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(MamFann) then FreeAndNil(MamFann); end; end.
実行する
実行ボタンを押して実行します。(デバッグ実行でもOK)Button1をクリックすると、学習を開始し、学習が完了するとLabel1に「平均二乗誤差(MSE)」を表示し、 Image1にはニューロン図を表示します。
SpinEdit1とSpinEdit2に任意の1桁の整数を入力してButton2をクリックすると、 AIの正答がLabel4に表示されます。