MNIST用畳み込み層ニューラルネットワーク(Convolutional Neural Network)

23 views
Skip to first unread message

mam

unread,
May 23, 2023, 9:26:26 AM5/23/23
to Japan RAD Studio User Group
MNIST用畳み込み層ニューラルネットワーク(Convolutional Neural Network)をDelphiソースコードのみで作成してみました。

「畳み込み層ニューラルネットワーク」のみで構成
https://mam-mam.net/delphi/cnn.html

「畳み込み層+全結合層ニューラルネットワーク」で構成
https://mam-mam.net/delphi/cnn_nn.html


ご参考まで。


mbb...@ybb.ne.jp

unread,
May 26, 2023, 5:33:11 PM5/26/23
to radstu...@googlegroups.com

Mam

Tonboです。

CNNの作成、ありがとうございました。

素晴らしいです!

 

動作させてみました。

(Delphi 11.2、コンパイル:Windows 64Bit Debugモード)

読込みはOKで、次の学習時に、

  1. 畳み込み層ニューラルネットワーク

procedure TMamCnn.ForwardProp(CInput:TArray<TArray<Single>>);

の先頭の

     for j := Low(fCSum[i]) to High(fCSum[i]) do

で次のコンパイルエラーが出ました。

「デバッガ例外通知

プロジェクト Project.exeは例外クラス $C0000005(メッセージ’ c0000005 ACCESS_VIOLATION)を送出しました。」

 

2.畳み込み層+全結合層ニューラルネットワーク

procedure TMamCnnNn.ForwardProp(CInput:TArray<TArray<Single>>);

の先頭の

for j := Low(fCSum[i]) to High(fCSum[i]) do

で同じエラーが出ました。

 

私では原因が分かりませんでした。

ご参考まで。

 

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

mam

unread,
May 26, 2023, 9:21:09 PM5/26/23
to Japan RAD Studio User Group
Tonbo 様

使っていただいてありがとうございます。
Delphi11.3 Community Edition
Windows64Bit Debugモードで動かしてみましたが、エラーなく動作しまして、原因がわかりませんでした。
すいません。

コンストラクタ内(constructor TMamCnn.Create;)の各変数の初期化で、初期値を誤った値に変更した場合には発生する可能性がありますが、そのままのソースコードでは発生しないと思うのですが、原因がわからずすいません。
CNNは設定できる値が非常に多いので、パディングを1に固定させていただいていて、またCNNの畳み込みのストライドは1に固定させていただいています。プーリング層のストライドも2(一般的には2以外の値を設定することはないそうです)で記述させていただいています。

ちなみに、
ACCESS_VIOLATIONは、確保していないメモリ領域にアクセスした(例えば配列でSetLengthで指定した以上の添え字を使用した、ポインタ変数で確保したメモリ以上にインクリメントした)場合に発生するものになります。



2023年5月27日土曜日 6:33:11 UTC+9 mbb...@ybb.ne.jp:

mbb...@ybb.ne.jp

unread,
May 27, 2023, 8:00:07 AM5/27/23
to radstu...@googlegroups.com

Mam

Tonboです。

エラーについて色々調査いただき、ありがとうございました。

動作しました!申し訳ありませんでした。

>初期値を誤った値に変更した場合には

これをしていました・・・

Mam様のソースコードのままでやり直したらOKでした。

 

私の旧式PCではこうなりました。

  1. 畳み込み層ニューラルネットワーク

学習時間:約18

正答率:87

  1. 畳み込み層+全結合層ニューラルネットワーク

学習時間:約4

正答率:94

正答率はパラメータを調整すれば良いです。

 

>CNNは…パディングを1に固定させていただいていて、またCNNの畳み込みのストライドは1に固定させていただいています。

>プーリング層のストライドも2…で記述させていただいています。

私はこれで十分です。これ以外使いません。

 

ソースコードを理解する能力はありませんが、

・専用の多次元行列の自作

・多次元行列の座標軸の入れ替え、行列形状の変更

・パディング、ストライドを組み込んで、forward PropagationBack Propagation

等々を解決されたのだと思います。

気が遠くなります。私は挫折しました。

 

1.は全結合層が無いのでメモリ量が節約され、全結合層有りより大きな画像が扱えそうです。

確かめたいです。

TensorflowPython無し、がいいです。

これから、色々動作させてみたいと思います。

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

 

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

Reply all
Reply to author
Forward
0 new messages