jj1gujのブログ

アイコン画像は音速の奇行子 様よりいただきました

Fortranで機械学習をやりたい!!

お久しぶりです.
最近こんなことを思っています…
なんでこんなことを思ってるかって?
急に, 機械学習ってみんなPythonでやってるよなぁ…みんなと違うことしたいよなぁって思っちゃったからです.
思っちゃったものは仕方ないですよね()
ではさっそくいってみましょうか.
ソースコードはこちらにあるので合わせてお読みください.

github.com

目次

目標

なにをするにも目標を立てることが大事です.
なので目標を立てましょう.

方法

目標を立てたら次に作戦, もとい方法を考えましょう.

第1章

Pythonの入門ですね.
一時期AtCoderFortranのLanguage Owners 1位*4だったぼくには再びFortranに入門する必要もないでしょう()
ってことで飛ばします

第2章

パーセプトロンについてはFortranでやってるかたがいらっしゃるようですね.

qiita.com

ここまで難しいのはあれなので本に書いてある簡単な論理ゲートを実装してみましょう.

github.com

そういえばFortranの配列ってNumpyみたいに式かけば要素積取れるんですね.
初めて知りました.
っていうか誰ですか再びFortranに入門する必要もないとか言った人は.

第3章

ここではニュラルネットワークの説明と必要な機能の実装をしていますね.
1年ぶりくらいに読んだんですがめっちゃ勉強になりますね.
まあ研究テーマ機械学習じゃないんですが()*5
ここはまだまだ軽いのでひたすら実装していきます.

github.com

行列積はOpenMPでもりもり並列化かけました.
あと後半のMNISTはなんかFortranで実装するのつらそうだったのでとりあえず飛ばしました.
人生逃げることも大事だよ.
というかFortranの関数定義とかモジュールとかサブルーチンとか初めて触ったわ~
っていうか誰ですか(ry

第4章

ここめっちゃ学習のかなめの部分じゃないですか~
実装が途端に重くなりましたね.
とりあえず損失関数は有り余る才能()で書けて, 勾配計算もさっきなんとかなりました.

github.com

あと勾配降下法とか学習アルゴリズムの実装とかそこら辺ですね.動作確認してないですが今日あらかた完成させました. いうことでいよいよMNISTデータセットと戦います.
辛いですね. (2020年7月4日)

MNISTデータセットの読み込み

こちらは本編ではあまり触れられていませんでした(ただgithubに上がってるこのコード使ってねで終わってた)
Python機械学習用ライブラリではそこらへんもコマンド一つで勝手にやってくれるというぬるさっぷりですが()我らがFortranでは1から実装していきます.
まずはこちらのサイトからMNISTデータセットをダウンロードしてしまいましょう.

yann.lecun.com

このページを下の方にスクロールしていくとデータの格納形式が書いてありますね.
画像データについてはこんな感じらしいです.

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000803(2051) magic number
0004     32 bit integer  60000            number of images
0008     32 bit integer  28               number of rows
0012     32 bit integer  28               number of columns
0016     unsigned byte   ??               pixel
0017     unsigned byte   ??               pixel
........
xxxx     unsigned byte   ??               pixel

ラベルデータについてはこんな感じらしいです.

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000801(2049) magic number (MSB first)
0004     32 bit integer  10000            number of items
0008     unsigned byte   ??               label
0009     unsigned byte   ??               label
........
xxxx     unsigned byte   ??               label

(いずれもMNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burgesより抜粋)
とりあえずさっと書いて読んでみたのですがうまく行かないのでとりあえず今日のところは寝てまたやります.

今後の目標

まだ完成してないけど今後の目標を書いておきましょう.

最後に

い か が で し た か ? 笑
なんか進捗報告だけでほぼほぼ解説してないですがちゃんとできたら解説も書きます(ほんまか?)
あとすぐには対応できないかもですけどアドバイスとかあったらいただけると幸いです.

参考文献

斎藤 康毅 著 「ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装」(O'Reilly Japan)
Fortran 入門
Fortran Tip集
Fortran演習 (地球惑星物理学演習) — Fortran演習(地球惑星物理学演習)
MNIST:手書き数字の画像データセット:AI・機械学習のデータセット辞典 - @IT
MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

(追記)
2020/7/4 進捗を追加
2020/7/8 MNISTデータセットについて適当に解説を加えた&参考文献を追加

*1:未来屋書店アニメイトが隣同士だったから仕方ないよね

*2:未来屋書店技術書の揃えが悪すぎてさすがに悪すぎて笑ってしまった

*3:レイクタウンは球詠の聖地です. みなさん行きましょう

*4:Fortran(GNU Fortran 9.2.1)での記録

*5:進捗, やばいです