みんな深層学習してるかな?
さて、GoogLeNetとか、みんな好きかな?オレはわりと好き。
なにしろプリトレインドモデルがあるからお手軽なんだよね。そこが好き。
あと、なにしろalexnetはデカすぎる。
なんでこんなにデカイんだ、という感じ。まあ1GBくらいなんだけど、Raspberry Piだと普通に読み込めないほど巨大なのよね。
しかし自分で作ったニューラル・ネットワークにImageNetのILSVRC2012を学習させようとするとやばいことになる。
なんということでしょう。
この圧倒的絶望感
SSDonlyでこのスピードですからね。
9日経っても1エポックすら進んでいないとは
一説によると、GoogleのGPU(TPU?)ファームは3万GPU(Maxwell世代だと合計約1億2千万コア)あるらしく、1000GPU(300万コア)でILSVRC2012の学習に1日かかるらしい。
火を噴くオレのTITANXでは10日経っても1エポックもいかないというのももしかすると無理も無い話である。
そこでやはりファインチューニングでしょう、ということで色々調べてみるが、なんと世界中の皆さんがドヤ顔で解説するQiitaを持ってしても、ChainerでGoogLeNet(AlexNetでも)をファインチューニングしてみましたテヘペロ、という内容がどこにもない!どうなってんじゃ。おまえら本当はちゃんとプログラム書いてないんじゃないのか?実用的な使い方を考えても見ないんじゃないのか?
ということでコツコツファインチューニングを試していたんだけど、やっぱりファインチューニングはいいね。何と言っても、手っ取り早いからね。
たとえばどうしてもまともな結果にならないCaltech101ってありますよね?
こいつをNIN(Network In Network)でひたすら学習させるとですね
ほらね、絶望的でしょう。本番時に65%しか正解率が出ない
ところが学習済みGoogLeNetにファインチューニングをかけると98%まで向上するわけですよ。
なんということでしょう。
というわけで、DEEPstationに機能追加することはまあ前提として、とりあえずDeelに実装してみました。
するとわずか22行でOK
相変わらず簡単すぎるわけです。
具体的には
$ git clone https://github.com/uei/deel.git
$ cd deel
$ cd misc
$ ./getPretrainedModels.sh
$ cd ../data
$ ./getCaltech101.sh
$ cd ..
$ python finetuning.py
これだけでCaltech101をGoogLeNetに転移学習できる。
もちろん、Caltech101じゃないものをやりたいときは、適当なディレクトリでdata/make_train_data.pyを呼び出せばいい
ただ、いざファインチューニングをしようとすると、単純なAlexNetと違って出口がたくさんあるGoogLeNetはちょっとややこしかった。
なんでかっていうとGoogLeNetはlossが3つあって、それぞれの場所でSoftmax_Cross_Entropyを掛けて逆伝播する必要がある。
昨日の実装で一番苦労したのはここだな。
まあプログラミングは常にろくでもない苦労と背中合わせよ。
終わってみれば「別に別に苦労するところじゃ無いじゃん」っていうところで躓くんだよなあ、なぜかいつも
まーとにもかくなも、これだけできればもうOK
TITANX一枚でも、半日もしないで学習完了。100エポックも回せば完璧にいきますよ。イエーイ。
まあ細かい実装が気になる人は https://github.com/uei/deelでも眺めてくれい。実装汚いけど
ファインチューニングしたニューラル・ネットワークはfinetuningInference.pyで使ってみることができる。
好きなファイルをtest.jpgという名前で保存して実行すると、ちゃんと推定される。
ビーバーの写真を見せたらもうビーバーと完全に認識しちゃう。やったね。
これでだいたいのものは分類できるんじゃないかなあ
ほんじゃあねー
- 会員限定の新着記事が読み放題!※1
- 動画や生放送などの追加コンテンツが見放題!※2
-
- ※1、入会月以降の記事が対象になります。
- ※2、チャンネルによって、見放題になるコンテンツは異なります。





