データサイエンスTweetAI人材になるぞ!機械学習が最近流行ってますね。興味があったので遊んでみることにしました。(なりません)(決して某振がつらくて現実逃避をしているわけではない)とはいえ、実は3年ほど前にも手を出したことがあり、当時は手書き文字認識を書いたりしていたのですが、つらすぎてやめてしまい、3年ぶりのチャレンジです。(D言語でフルスクラッチで書いた)(行列の演算とかから全部書いたので辛かった)(リポジトリも消してしまった)(手書き文字認識できて満足してしまった)今回はおとなしくライブラリを使いました。何がよいかよくわからなかったので、とりあえずChainerを使いました。手書き文字の認識ばっかりしてもアレなので、画像分類をしてみます。ほとんど既存のものを使っているので、そんなに内容はありません。これからぼちぼち勉強していこうという気持ちです。ソースは以下に公開しています。ちなみにnobeliumは原子番号102の元素で、アルフレッド・ノーベルにちなんで名付けられた元素です。github.comまず、始める前にこの青い本を一通り読みました。見るとりあえず畳み込んでいくんだなという感じです。今回は102枚の花の分類をしてみます。これにしたかというと、僕はお花が好きで、たまたまここにデータセットがあったからです。Pageデータの取得・処理data.pyにはデータ関連の処理をまとめています。後述しますが、学習をしたりするのはEC2のスポットインスタンスを使います、貧困大学院生なので。ボリュームは毎回消すため、毎回データを取得したりする必要があります。そこらへんの処理も書いていきます。OxfordのWebから花の画像とラベルを取得してきます。item.name[:item.name.rfind('/')])取得した画像は、事前処理を行います。pre_process_dataでは、引数で与えられた長さを持つ正方形に画像に変換しています。Trueこのとき、calc_meanをしています。これは正規化のための、全ての画像の平均を求める処理です。この平均を求める処理では、get_datasetsを呼んでいます。meanget_datasetsは、事前処理された画像を、訓練データとテストデータに分けて返すものです。chainer.datasets.split_dataset_randomがいい感じにやってくれます。このseedに同じ値を渡せば、同じように分割されるので、calc_meanから呼んでもどこから呼んでも同じ訓練データとテストデータが返ってきます。modelでぃーぷらーにんぐのぶれいんであるところのモデルです。今回はResNet-50を使ってみます。kumilog.netなぜResNet-50にしたかというと、chainer.linksにあって、ここの比較でOperationsとAccuracyが良さそうだったからです。Applications独り言ですが、オープンアクセスの論文って良いですね。ResNet-50を使うことにしたわけですが、0から学習をするのはつらそうなので、先人たちが学習して公開してくれている重みを使わせていただき、それから少しだけ学習するという感じでいきます。「ファインチューニング」ってやつです。Qiitaモデルはmodels/resnet50_v1.pyに記載しています。v1なのは、ここから更に改良するつもりだったからです。)chainerのResNetのモデルはこんな感じになっています。GitHub今回は、最後のfc6だけを学習するような感じにします。fc6以外を固定するのは後述のmodel.base.disable_update()です。学習済みデータは↓を使います。RecognitionなんかダウンロードリンクがOneDriveのものになっていてやりにくいので、S3にあげてそこからダウンロードするようにしました。それがfetch_modelです。このモデルを図で出すと↓みたいな感じです。(めっちゃ重い)(見ても特に何もわからない)https://s3-ap-northeast-1.amazonaws.com/hayashikun/flowers_nobelium/cg.pngtraining訓練をしたりします。main()画像の事前処理では、画像サイズを224にしています。model)をして、学習したモデルを保存しています。output学習の結果はS3に保存します。output.pyに諸々の処理を書いています。訓練を開始するときは、init_trainでまずS3にディレクトリを作ります。hashを入れたログを出しています。upload_resultで諸々のログとか学習済みのモデルとかをS3にアップロードしています。Body=f)fetch_logとlog_listはS3に保存されたデータをローカルでjupyterとかから引っ張ってくるためです。8.0)をスポットインスタンスで借りて使いました。だいたい1時間30円程度でした。credentialsの設定をします。git@github.com:hayashikun/flowers_nobelium.git諸々インストールする、そろそろpipenvを使うようにすべきかなぁ。requirements.txt訓練する。stdout.txtでぼちぼち見ながら完了したらスポットインスタンスを落として、後でじっくりlogをみるという感じ。結果50世代ほど計算させた結果です。S3に上がってきた結果はこんな感じ。10000iterで2時間程度なので、30分くらい15世代くらいの訓練で十分だった。ここからもっと精度を上げようと思うと、別の層をファインチューニングするか、別のモデルを使うかという感じになるのかな。ここからもっと弄るのもいいけど、次に移ってなんか別のことをしたい。研究でも微分積分畳み込みはよく使うので、理解もそんなに辛くはなかった。あと、GPUはすごい。(1)はてなブログをはじめよう!hayashikunsanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。