Delphiのみで人工ニューラルネットワーク(Artificial Neural Network)のクラスを作りました

341 views
Skip to first unread message

mam

unread,
Dec 9, 2022, 9:14:02 AM12/9/22
to Japan RAD Studio User Group
表題の件、そのままですが、
Delphiのみで人工ニューラルネットワーク(Artificial Neural Network)のクラスを作りました。DLLなどは不要です。
処理速度はそれほど速くないです。(すいません)
が、単純な回帰問題や分類問題なら解けるみたいです。

よろしければ、使ってみてください。

以上、よろしくお願い申し上げます。

mam

unread,
Dec 12, 2022, 8:03:19 AM12/12/22
to Japan RAD Studio User Group
このクラスを使って、日経平均株価終値を予測してみました。
2022年12月9日金曜日 23:14:02 UTC+9 mam:

mbb...@ybb.ne.jp

unread,
Dec 16, 2022, 7:01:42 PM12/16/22
to radstu...@googlegroups.com

Mam

Tonboです。

 

紹介ありがとうございます。

動作を確認しました。

日経平均株価終値を予測、も動きました。

 

BackPropagationも入っていますね。本格的です。

活性化関数はシグモイド関数だけですが、必要であれば、ReLU等も

組み込めそうです。

学習時間も一瞬です。

畳み込みはありませんが、画像でもカメラを固定すればいけるのでは

ないでしょうか。

 

私は機械学習が仕事ではありませんが、生産現場で使えるようなツールを

作れたらいいなと思い、空いている時間、約1年、色々しましたが、

挫折の連続です。

 

〇既存のPythonのソースを参考に、畳み込みをDelphiで作ろうとしたが、

 制作に時間がかかりすぎ中断。

〇妥協して、学習はTensorflowに任せ、学習結果をDelphiで使おうとしたが、

・当然あるはずの、学習結果の内部構造の記載が見つからず。

・それならと、内部構造を一気に出力するViewerを探したが、見つからず。

〇仕方がないので、学習から判断までをPythonでしようとしました。

しかし、畳み込みで画素を大きくすると、GPUがオーバーフローして学習できない。

せいぜい数百x数百どまりです。私は1000x1000以上欲しいです。

 

ということで、全て行き詰まっています。

mamさんのツールが解決にならないか、色々確かめてみたいと思います。

ありがとうございました。

 

---------------------------------------
Subject: [radstudio-jp:325] Delphi
のみで人工ニューラルネットワーク(Artificial Neural Network)のクラスを作りました

mam

unread,
Feb 5, 2023, 8:29:42 PM2/5/23
to Japan RAD Studio User Group
活性化関数ReLUも組み込みました。
  TMamActivationFunc.Sigmoid指定時
    中間層はシグモイド関数、出力層は恒等関数を使用
  TMamActivationFunc.ReLU指定時
    中間層はReLU関数、出力層はシグモイド関数を使用
https://mam-mam.net/delphi/ann.html

中間層(隠れ層)にReLUを使用する場合
Ann:=TMamAnn.Create(Neurons,0.1,TMamActivationFunc.ReLU );

Pythonは多くの数学ライブラリが存在して素晴らしいのですが、
あくまで個人的な印象なのですが、
メモリーを多く消費する(多分Delphiの10倍は使う)、単体では処理速度がかなり遅い(NumPyを使ってもDelphiの1/10未満では?)という印象があります。



2022年12月17日土曜日 9:01:42 UTC+9 mbbbg01:

mbb...@ybb.ne.jp

unread,
Feb 11, 2023, 7:31:42 AM2/11/23
to radstu...@googlegroups.com

Mam

Tonboです。

ReLUの組込み、ありがとうございます。

動作することを確認しました。

 

ReLUでは、分類で認識率が67%と落ちますね。

理由は考えてみます。

 

それから、画像で良否判定にはオートエンコーダが有効です。

Delphiだけで実現したいと思っていますがハードルが高いです。

できましたら、いつか取りかかって頂けると嬉しいです。

 

Pythonは、できれば使いたくないです。

本当に遅いですね。

Loopしなくて良いように色んな書き方が用意されていますが、直ぐ忘れます。

新人がサクサク使っているのを見ると、さらにいやになります。

 

今後、Mamさんのアップされているサンプルを試してみたく思っています。

ありがとうございました。

mam

unread,
Feb 12, 2023, 11:48:56 PM2/12/23
to Japan RAD Studio User Group
mnistで、sigmoidとReLUの正答率を確認してみました。

Sigmoidの場合は層を増やしてもニューロンを増やしても93.64%
ReLUの場合は層を増やしてニューロンを増やすと94.5%
入力層28ニューロン
中間層80ニューロン
中間層40ニューロン
出力層10ニューロン

fashion-mnistの場合はどちらも同じ程度でした。

ReLUの場合は層を増やしてニューロンを増やすと少しだけ正答率が高くなる可能性があるのかもです。
Sigmoidの場合は層をReLUのように増やしてもニューロン数を増やしてもあまり正解率が変わらないのかもです。
いずれにせよ、学習させるデータによって一概には言えないみたいですが・・・。



2023年2月11日土曜日 21:31:42 UTC+9 mbb...@ybb.ne.jp:

mam

unread,
Feb 12, 2023, 11:51:18 PM2/12/23
to Japan RAD Studio User Group
投稿にミスがありました。すいません。
入力層28ニューロン
  ⇒  入力層784ニューロン
です。すいません。
2023年2月13日月曜日 13:48:56 UTC+9 mam:

mbb...@ybb.ne.jp

unread,
Feb 13, 2023, 3:48:12 PM2/13/23
to radstu...@googlegroups.com

Mam

Tonboです。

追加のテストをありがとうございます。

 

こちらでは、以下のようになりました。

 

Sigmoidでは、入力層が784の時、確率が下がりました。

-6%が出ました。

 

ReLUでは、28で既に99%です。

784でも同等でした。素晴らしいです。

 

Sigmoidは、層が深くなるにつれ勾配喪失が起きるので、

ReLUが使われるようになったそうですね。

でもマイナス側0は、最初は気になりました。

 

ありがとうございました。

 

---------------------------------------

Epoch = 10000 共通

 

Sigmoid

Ann:=TMamAnn.Create(Neurons);

 

SetLength(Neurons, 4);

Neurons[0]  := 28;   

Neurons[1]  := 80;   

Neurons[2]  := 40;   

Neurons[3]  := 10;   

 

0 XOR 0 0の確率100%1の確率  0%

0 XOR 1 0の確率  0%1の確率100%

1 XOR 0 0の確率  0%1の確率100%

1 XOR 1 0の確率100%1の確率  0%

 

SetLength(Neurons, 4);

Neurons[0]  := 784;  

Neurons[1]  := 80;   

Neurons[2]  := 40;   

Neurons[3]  := 10;   

 

0 XOR 0 0の確率 67%1の確率 33%

0 XOR 1 0の確率 -6%1の確率106%

1 XOR 0 0の確率 67%1の確率 33%

1 XOR 1 0の確率 67%1の確率 33%

 

ReLU

Ann:=TMamAnn.Create(Neurons, 0.1, TMamActivationFunc.ReLU);

 

SetLength(Neurons, 4);

Neurons[0]  := 28;   

Neurons[1]  := 80;   

Neurons[2]  := 40;   

Neurons[3]  := 10;   

 

0 XOR 0 0の確率 99%1の確率  1%

0 XOR 1 0の確率  0%1の確率100%

1 XOR 0 0の確率  0%1の確率100%

1 XOR 1 0の確率100%1の確率  0%

 

SetLength(Neurons, 4);

Neurons[0]  := 784;  

Neurons[1]  := 80;   

Neurons[2]  := 40;   

Neurons[3]  := 10;   

 

0 XOR 0 0の確率 99%1の確率  1%

0 XOR 1 0の確率  0%1の確率100%

1 XOR 0 0の確率  0%1の確率100%

1 XOR 1 0の確率100%1の確率  0%

mbb...@ybb.ne.jp

unread,
Mar 5, 2023, 5:58:09 AM3/5/23
to radstu...@googlegroups.com

Tonboです。

いつもお世話になっています。

 

特殊な質問です。

Delphi 64Bit版アプリ + D2XXUnit.pas + ftd2xx.dll

で、BitBang動作させている方はみえるでしょうか?

 

対象は、FT245RLモジュールです。

 

なお、Delphi32Bitでコンパイルすれば問題なく動作します。

 

【行き詰まった点】

USUドライバ ftd2xx.dllには32Bit版と64Bit版があります。

 しかし、FT245RLを刺したとたんに、32Bit(推測)

ftd2xx.dllで接続されるため、64Bit版アプリから、設定、動作

 させようとするとエラーで停止します。

 

・ドライバアンインストーラ CDMuninstallerGUI.exe

  ドライバのアンインストールをして、64Bit版アプリから、

  設定、動作させようとしましたがエラーで停止します。

 

64Bitftd2xx.dllのみをインストールしようとしましたが、

 私ではできませんでした。

 

【補足】

D2XXUnit.pasftd2xx.dllCDMuninstallerGUI.exeFTDI社の

 HPから入手しました。

https://www.ftdichip.com/old2020/Support/SoftwareExamples/CodeExamples/Delphi.htm

https://www.ftdichip.com/old2020/Drivers/D2XX.htm

https://ftdichip.com/utilities/

 

・ドライバのインスト―ルは、

  CDM21228_Setup.zipのダブルクリックと、

  CDM v2.12.28 WHQL Certified.zipからと

 2つ確かめましたが、どちらも同じでした。

 

Delphi 10.411.2 どちらでもNGです。

 

FT245RLモジュールは秋月電子から購入しました。

https://akizukidenshi.com/catalog/g/gK-01799/

 

【注意】

D2XXUnit.pasをコンパイルするには、implementation

Procedure FT_Error_Reportの前に移動が必要でした。

 

D2XXUnit.pasには、implementation移動等の

修正版がありますが、結果は同じでした。

https://github.com/serbod/dataport/blob/master/D2XXUnit.pas

 

色々試したのですが、闇雲のため省略します。

 

Delphi 64Bit版で動作させている方がみえましたら

アドバイスお願いいたします。

Shoichi Yamasuge

unread,
Mar 5, 2023, 8:34:19 AM3/5/23
to radstu...@googlegroups.com


こんにちは、やましょうです。

確認は行なっていませんが、
D2XXUnit.pasのDLL32BIT版を指していますよね?
D2XXUnit.pasのDLL64BIT版に変更してみては?
いかがですか?
 ftd2xx64.dll
 


2023年3月5日(日) 19:58 <mbb...@ybb.ne.jp>:
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/radstudio-jp/000c01d94f51%243cc55190%24b64ff4b0%24%40ybb.ne.jp にアクセスしてください。

mbb...@ybb.ne.jp

unread,
Mar 5, 2023, 4:26:01 PM3/5/23
to radstu...@googlegroups.com

やましょう様

 

早速ご返事ありがとうございます。

ご指摘のように、

CDM v2.12.28 WHQL Certified.zipには

64Bit版のftd2xx64.dll(633kB)

32Bit版のftd2xx.dll(383kB)

が入っていて、FTDI社の以下の

FTDI Drivers Installation Guide forWindows 10」の

Manual Installation」通りドライバをインストールすると、

ftd2xx64.dllがリネームされC:\Windows\System32\ ftd2xx.dllに入ります。

(32Bit版はC:\Windows\SysWOW64\ ftd2xx.dllに入る)

https://www.ftdichip.com/old2020/Support/Documents/InstallGuides.htm

 

次をしてみましたが、エラー「プロセスが有効ではありません」が出ます。

1.D2XXUnit.pasdllの指定を、ftd2xx64.dllにする。

FT_DLL_Name = 'C:\\ ftd2xx64.dll ';

2. FT_DLL_Name = ' C:\Windows\System32\ ftd2xx.dll ';

3. System3264Bit ftd2xx.dllexeのカレントフォルダに置く。

 

64Bit ftd2xx.dllがあるので諦めきれず、粘っています・・・

Shoichi Yamasuge

unread,
Mar 5, 2023, 9:36:00 PM3/5/23
to radstu...@googlegroups.com

こんにちは、
やましょうです。

なるほど、インストラーでリネームするんですね。
これソース見ると判るんですが、
OPENはできるけど、動作でないって感じですね?
まず、 D2XXUnit.pas のこれ型の宣言が32BIT用になっていますが、
このあたり直していますか?
まず問題は  /
  FT_HANDLE: がDWORD 32BITになっていますが、
これ64BITに変更しないとダメだと思います。
まぁそれ以前にハンドルなのでTHANDLEで宣言してあればこの問題は発生しなかったと思いますが、
私はそれで確認してUART送付できました。
ちなUARTだけでしたら、私のWUNI232Cを使った方が簡単かもしないです。

以上
確認ください。


2023年3月6日(月) 6:26 <mbb...@ybb.ne.jp>:
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/radstudio-jp/000101d94fa8%24f3b20310%24db160930%24%40ybb.ne.jp にアクセスしてください。

Hiroaki Kitahata

unread,
Mar 6, 2023, 2:22:33 AM3/6/23
to radstu...@googlegroups.com
こんにちは

別の話ですが、
以前、正しい hoge.dll が存在するにもかかわらず、hoge.dll が無いという
実行時エラーが出たことがありました。
Delphi で作成したアプリから、hoge.dll を使いに行くパターンです。
hoge.dll が依存している別の fuga.dll が無かったのが原因でした。
fuga.dll が見つからないというエラーならわかりやすかったのですが…

fuga.dll は、殆どの場合、通常どこかに存在する、マイクロソフトが
提供している再配布可能な msxxx.dll でしたが、場合によっては
無いこともあるようでした。

関係ないかもしれませんが、参考になれば。


On Sun, 5 Mar 2023 19:57:10 +0900
Subject: [radstudio-jp:352] Delphi 64Bit版アプリ + D2XXUnit.pas + ftd2xx.dll
> --
> このメールは Google グループのグループ「Japan RAD Studio User Group」の登録者に送られています。
> このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msgid/radstudio-jp/000c01d94f51%243cc55190%24b64ff4b0%24%40ybb.ne.jp にアクセスしてください。

--
Hiroaki Kitahata <kita...@wingcomputer.com>

Hikaru Fukushi

unread,
Mar 6, 2023, 2:54:34 AM3/6/23
to radstu...@googlegroups.com
Tonboさん、やましょうさん、Kitahataさん、こんにちは。福士です。

> 以前、正しい hoge.dll が存在するにもかかわらず、hoge.dll が無いという
> 実行時エラーが出たことがありました。
> Delphi で作成したアプリから、hoge.dll を使いに行くパターンです。
> hoge.dll が依存している別の fuga.dll が無かったのが原因でした。
> fuga.dll が見つからないというエラーならわかりやすかったのですが…
>
> fuga.dll は、殆どの場合、通常どこかに存在する、マイクロソフトが
> 提供している再配布可能な msxxx.dll でしたが、場合によっては
> 無いこともあるようでした。

DLLの依存関係を調べるにはDependenciesがおすすめです。以前Microsoftから
提供されていたDependency Walkerの代替になります。

lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues.
https://github.com/lucasg/Dependencies


+=========+=========+=========+=========+=========+=========+=========+
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp
過去のSecurity Advisoryは http://qnap420d/~Administrator/sa/
+=========+=========+=========+=========+=========+=========+=========+


mbb...@ybb.ne.jp

unread,
Mar 6, 2023, 7:41:04 AM3/6/23
to radstu...@googlegroups.com

やましょう様

続けてありがとうございます。

これまで32Bitだけで済ませてきたつけが回ってきました。

D2xx以前の問題と気付きました。

色々行いましたが、まだ解決していません。

 

D2XXUnit.pas

オリジナルのimplementationを、式「Procedure FT_Error_Report」の前に

移動したものを使用しています。

関係する式

FT_HANDLE : DWord = 0;

function FT_SetBaudRate(ftHandle:Dword; BaudRate:DWord):FT_Result; stdcall; External FT_DLL_Name name 'FT_SetBaudRate';

 

Delphi側】

順番に実行

GetFTDeviceCount;                    //FT_Device_CountFT245RLの個数が入る

GetFTDeviceSerialNo(0);           //SerialNumberにナンバーが入る

Open_USB_Device_By_Serial_Number(SerialNumber);   // FT_Handleが設定される

FT_SetBaudRate(FT_Handle, 38400);            //ボーレート設定。ここでエラー

 

【エラー】

FT_SetBaudRate(FT_Handle, 38400);

FT_Handle38400 D2XXUnit.pas側に伝わず、エラーとなります。

双方、同じDword 4バイトなのでいいと思うのですが。

 

D2XXUnit.pas

FT_HANDLE :THANDLE = 0; としてみましたが、範囲外エラーになりました。

 

間違い等、ご指摘いただけると嬉しいです。

 

---------------------------------------

mbb...@ybb.ne.jp

unread,
Mar 6, 2023, 7:54:54 AM3/6/23
to radstu...@googlegroups.com
Kitahata様
Tonboです。
情報ありがとうございます。

fuga.dllが無いのにhoge.dll が無いとエラーが出ることがあるのですね。
64Bitはこれまでせずに済ませてきたので、これから色々経験しそうです。
注意いたします。
ありがとうございました。

-----Original Message-----
From: radstu...@googlegroups.com <radstu...@googlegroups.com> On
Behalf Of Hiroaki Kitahata
Sent: Monday, March 6, 2023 4:23 PM
To: radstu...@googlegroups.com
winmail.dat

mbb...@ybb.ne.jp

unread,
Mar 6, 2023, 8:34:48 AM3/6/23
to radstu...@googlegroups.com
福士様

Tonboです。
情報ありがとうございます。
入手しました!
手軽で使い易いですね。活用させていただきます。

Shoichi Yamasuge

unread,
Mar 6, 2023, 9:58:40 AM3/6/23
to radstu...@googlegroups.com
 各位

ありがとうございます。
やはり私の環境では動きます。

基本HandleをTHanldeに変更しただけです。
テストファイルを添付するので確認してください。


2023年3月6日(月) 22:34 <mbb...@ybb.ne.jp>:
--
このメールは Google グループのグループ「Japan RAD Studio User Group」の登録者に送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msgid/radstudio-jp/001101d95030%244991bb40%24dcb531c0%24%40ybb.ne.jp にアクセスしてください。
d2test.zip

mbb...@ybb.ne.jp

unread,
Mar 6, 2023, 4:57:14 PM3/6/23
to radstu...@googlegroups.com

やましょう様

Tonboです。

資料、ありがとうございました。

無事、動作を確認しました!

これから外出し、夜遅く戻ります。

帰ってから間違いを調べます。

 

それと、WUNI232Cも拝見します。

 

これで、64Bitでもftd2xxが使えることが分かり安心しました。

まずはお礼申し上げます。

 

From: radstu...@googlegroups.com <radstu...@googlegroups.com> On Behalf Of Shoichi Yamasuge


Sent: Monday, March 6, 2023 11:58 PM
To: radstu...@googlegroups.com

Subject: Re: [radstudio-jp:365] Re: Delphi 64Bit

版アプリ + D2XXUnit.pas + ftd2xx.dll

mbb...@ybb.ne.jp

unread,
Mar 7, 2023, 7:46:15 AM3/7/23
to radstu...@googlegroups.com

やましょうさん、Kitahataさん、福士さん

Tonboです。

アドバイスと情報をありがとうございました。

無事、解決しました。

 

32bitアプリを作ってきて、「ハンドルはCardinal 32bit」の

固定観念がありました。

やましょうさんから「FT_HANDLE: DWORD 32BITになっていますが、

これ64BITに変更しないとダメだと思います。」のアドバイスを

頂いたのですが、理解できませんでした。

具体的に提示いただかなければ、解決できないまま終わったと思います。

本当に感謝いたします。

PS:

Dependenciesftd2xx.dllの全関数が見えました。

Dependency Walkerではフリーズしました)

各変数のバイト数までわかるといいですね。

・今後、UART64Bit対応にします。

WUNI232Cを試させていただきます。

 

From: radstu...@googlegroups.com <radstu...@googlegroups.com> On Behalf Of Shoichi Yamasuge


Sent: Monday, March 6, 2023 11:58 PM
To: radstu...@googlegroups.com

版アプリ + D2XXUnit.pas + ftd2xx.dll

Reply all
Reply to author
Forward
0 new messages