しばらくぶりの更新です。画像のデータセット、CIFAR-10を使って画像認識の実験(の準備)中です。
前から凄く興味があって、とにかくやってみたかったのです。学校も冬休みに入り、時間もかなり自由になったので進んでいます。何年か前、文字認識は試してうまくいきました。CIFAR-10には船や馬など10種類、それぞれの種類の様々の5万枚の写真が含まれています。CNN(畳み込みネットワーク)でやっていますが、参考文献にはコード自体は載っておらず、数式だけ。それでよいのですが、特に(全結合の)逆伝播のところなど、数式が載っていなかったりします。多分英語の文献あたりにはあるのかも知れませんが、自分で導きました。難しいのもあったけれどこれも勉強です。
C#でプログラムを書いています。書いたことがないと分からないかも知れません。「自分で書こうとすればいつでもできる。楽に、ライブラリを使えばいい」と思う人も多いのでは? しかし、とんでもない話です。使う配列の次元をどうするか、添え字の範囲をどうするか、普通に畳み込みをすると画像のサイズは小さくなるけれど(理屈では画像の縁の部分は処理できないため)それを避けるためにゼロパディングした方がいいのか。扱うデータが大量でデバッグはしにくいし、単純に「数式が分かっていれば、あとはコーディングするだけ」ということではなく、考えなければならないことはたくさんあり、すぐにあっちでもこっちでもつまずきます。しかしこのたくさんの小さなトラブルを解決することが勉強になるのでしょう。
自然科学の勉強に実験は不可欠だと思います。考えて、自分の手で何かやってみて、どんなことが起こるのか自分の目で確かめてまた考える。これが勉強。画像認識だって、小さなシステムでよいのでフルスクラッチで作り上げれば理解が深まるというものではないでしょうか。実際、こうすることによって初めて自分の言葉で画像認識について話すことができるようになる気がします。自分で体験したことだからです。このあとプーリング層からの逆伝播をコーディングして勾配降下法を使うことになります。あとひと息です。年内には1回目の実験ができそうです。
夕べ「アレ???」と思ったことがあります。ぼくはC#をVisualStudioで使っているのですが、「'Form1.Pt.y' と 'Form1.Pt.y' 間があいまいです」のようなメッセージが大量に出てどうにもならなくなりました。うっかり「}」をひとつ消してしまったりするとあちこちでエラーが出るような感じかな、と思って見てみたのですが分からず。しばらく悩んで「あ!」と思い当たりました。プロジェクトはひとつのフォルダに入ります。その中の「***.cs」というファイルがC#のコードです。フォルダ全体だと容量も大きくて大変なのでこのファイルだけバックアップすることが多いのですが、夕べは「Form1.cs」というファイルを「2022-12-26Form1.cs」と日付をつけて同じフォルダに保存したのです。同じプロジェクトの中のcsファイルは開発環境が全て調べ、まとめたりするんですね。ひとつの名前空間(namespace)で同じ変数名2つを使うことはできません。ファイルは2つでも、それぞれに同じ名前のnamespaceがあればこれらは開発環境によってまとめられます。これが理由でした。「素人だからそういうことをやる」と思われるかも知れませんが。
深層学習の研究は大分進んでいるみたいですね。しかし「なぜうまくいくのか」という最も大事な質問に対するちゃんとした答えはまだ出ていないそう。未解決、ということです。面白いです。