トップへ(mam-mam.net/)

2つの1桁の整数の足し算をFANN(Fast Artificial Neural Network Library)に行わせる(ディープラーニング) ~Delphiでお手軽プログラミング

検索:

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に表示されます。