• このエントリーをはてなブックマークに追加

今なら、継続入会で月額会員費が1ヶ月分無料!

【機械学習】ChainerでGoogLeNetから画像をファインチューニングでお手軽学習【わずか22行で】
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

【機械学習】ChainerでGoogLeNetから画像をファインチューニングでお手軽学習【わずか22行で】

2016-09-10 16:47


     みんな深層学習してるかな?
     さて、GoogLeNetとか、みんな好きかな?オレはわりと好き。


     なにしろプリトレインドモデルがあるからお手軽なんだよね。そこが好き。
     あと、なにしろalexnetはデカすぎる。
     なんでこんなにデカイんだ、という感じ。まあ1GBくらいなんだけど、Raspberry Piだと普通に読み込めないほど巨大なのよね。


     しかし自分で作ったニューラル・ネットワークにImageNetのILSVRC2012を学習させようとするとやばいことになる。

    caec25e0eda5f744f3382f597794a596a2ef375c

    なんということでしょう。
    この圧倒的絶望感
    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)でひたすら学習させるとですね

    dd267c81406896563c233e5a608b00090499f30b


    ほらね、絶望的でしょう。本番時に65%しか正解率が出ない

    ところが学習済みGoogLeNetにファインチューニングをかけると98%まで向上するわけですよ。
    なんということでしょう。


    というわけで、DEEPstationに機能追加することはまあ前提として、とりあえずDeelに実装してみました。


    するとわずか22行でOK

    7ad0387c743ea6bc1d9d4fe99c34762169fa222f

    相変わらず簡単すぎるわけです。

    具体的には

    $ 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を掛けて逆伝播する必要がある。

    d7f1de12cab2ea2a3439fb3148860cd4bf50473c

    昨日の実装で一番苦労したのはここだな。
    まあプログラミングは常にろくでもない苦労と背中合わせよ。
    終わってみれば「別に別に苦労するところじゃ無いじゃん」っていうところで躓くんだよなあ、なぜかいつも


    まーとにもかくなも、これだけできればもうOK

    TITANX一枚でも、半日もしないで学習完了。100エポックも回せば完璧にいきますよ。イエーイ。
    まあ細かい実装が気になる人は https://github.com/uei/deelでも眺めてくれい。実装汚いけど


    ファインチューニングしたニューラル・ネットワークはfinetuningInference.pyで使ってみることができる。

    47ee723bc588f8c2365e030b32d407b0c9b992b8

    好きなファイルをtest.jpgという名前で保存して実行すると、ちゃんと推定される。

    cf9751b1646b8cc96660109e40ed2f676163630e

    ビーバーの写真を見せたらもうビーバーと完全に認識しちゃう。やったね。

    これでだいたいのものは分類できるんじゃないかなあ

    ほんじゃあねー


    チャンネル会員ならもっと楽しめる!
    • 会員限定の新着記事が読み放題!※1
    • 動画や生放送などの追加コンテンツが見放題!※2
      • ※1、入会月以降の記事が対象になります。
      • ※2、チャンネルによって、見放題になるコンテンツは異なります。
    ブログイメージ
    電脳ヒッチハイクガイド
    更新頻度: 毎週月曜日
    最終更新日:
    チャンネル月額: ¥1,080 (税込)

    チャンネルに入会して購読

    コメントを書く
    コメントをするには、
    ログインして下さい。