お久しぶりです.
最近こんなことを思っています…
なんでこんなことを思ってるかって?
急に, 機械学習ってみんなPythonでやってるよなぁ…みんなと違うことしたいよなぁって思っちゃったからです.
思っちゃったものは仕方ないですよね()
ではさっそくいってみましょうか.
ソースコードはこちらにあるので合わせてお読みください.
目次
目標
なにをするにも目標を立てることが大事です.
なので目標を立てましょう.
- 単純なレイヤからなるニューラルネットでMNISTをやる
方法
目標を立てたら次に作戦, もとい方法を考えましょう.
- オライリー社「ゼロから作るDeep Learning」内に記載されているコードをFortranで実装する
このためにわざわざレイクタウンで買いました.
ついでにアニメイトで球詠も買っちゃったよ*1*2*3.
買ったので久しぶりに読む pic.twitter.com/AzYTRrvucR
— 北海道行く〜2020 (@jj1guj) 2020年6月28日
かっちった pic.twitter.com/VAWM5vjuuz
— 北海道行く〜2020 (@jj1guj) 2020年6月28日
おおおお〜 pic.twitter.com/pfhjevwVcN
— 北海道行く〜2020 (@jj1guj) 2020年6月28日
第1章
Pythonの入門ですね.
一時期AtCoderでFortranのLanguage Owners 1位*4だったぼくには再びFortranに入門する必要もないでしょう()
ってことで飛ばします
第2章
パーセプトロンについてはFortranでやってるかたがいらっしゃるようですね.
ここまで難しいのはあれなので本に書いてある簡単な論理ゲートを実装してみましょう.
そういえばFortranの配列ってNumpyみたいに式かけば要素積取れるんですね.
初めて知りました.
っていうか誰ですか再びFortranに入門する必要もないとか言った人は.
第3章
ここではニュラルネットワークの説明と必要な機能の実装をしていますね.
1年ぶりくらいに読んだんですがめっちゃ勉強になりますね.
まあ研究テーマ機械学習じゃないんですが()*5
ここはまだまだ軽いのでひたすら実装していきます.
行列積はOpenMPでもりもり並列化かけました.
あと後半のMNISTはなんかFortranで実装するのつらそうだったのでとりあえず飛ばしました.
人生逃げることも大事だよ.
というかFortranの関数定義とかモジュールとかサブルーチンとか初めて触ったわ~
っていうか誰ですか(ry
第4章
ここめっちゃ学習のかなめの部分じゃないですか~
実装が途端に重くなりましたね.
とりあえず損失関数は有り余る才能()で書けて, 勾配計算もさっきなんとかなりました.
あと勾配降下法とか学習アルゴリズムの実装とかそこら辺ですね.動作確認してないですが今日あらかた完成させました. いうことでいよいよMNISTデータセットと戦います.
辛いですね. (2020年7月4日)
MNISTデータセットの読み込み
こちらは本編ではあまり触れられていませんでした(ただgithubに上がってるこのコード使ってねで終わってた)
Pythonの機械学習用ライブラリではそこらへんもコマンド一つで勝手にやってくれるというぬるさっぷりですが()我らがFortranでは1から実装していきます.
まずはこちらのサイトからMNISTデータセットをダウンロードしてしまいましょう.
このページを下の方にスクロールしていくとデータの格納形式が書いてありますね.
画像データについてはこんな感じらしいです.
[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より抜粋)
とりあえずさっと書いて読んでみたのですがうまく行かないのでとりあえず今日のところは寝てまたやります.
今後の目標
まだ完成してないけど今後の目標を書いておきましょう.
- CNNやる
- cifar-10やる
- オライリー社「ゼロから作るDeep Learning③」を読んでフレームワーク化する
- あわよくば高速化してCUDA対応に…ここまでやるのはつらいからやめておこう…
最後に
い か が で し た か ? 笑
なんか進捗報告だけでほぼほぼ解説してないですがちゃんとできたら解説も書きます(ほんまか?)
あとすぐには対応できないかもですけどアドバイスとかあったらいただけると幸いです.
参考文献
斎藤 康毅 著 「ゼロから作る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データセットについて適当に解説を加えた&参考文献を追加