CIFAR-10の画像分類をやってみます
こんにちは cedro です。
先回は、有名なCIFAR-10という一般物体認識用のデータセットをダウンロードしましたので、今回は、それを使って画像分類をしてみたいと思います。
CIFAR-10 の内容を見てみましょう。飛行機、自動車、鳥、猫、鹿、犬、カエル、馬、船、トラックの10種類の画像があります。
乗り物が4種類、陸の動物が6種類で、海の動物や植物は見当たりません。誰が選んだか分かりませんが、少し偏った趣味の方なのかな(笑)。
各種類の画像を見ると、様々な角度から撮ってあり、遠景ありズームアップありとバリエーションが豊かです。
画像のサイズはカラー 32×32ピクセルと小さくて、とりあえずディープラーニングの学習・評価をやってみたい向きには手頃で良いですが、見やすくしようと拡大すると、かなりボケた感じになります。
各種類 6,000枚 × 10種類 = 60,000枚 の画像があり、これが学習ファイル 50,000枚と評価ファイル 10,000枚に振り分けられています。
さて、ニューラルネットワークの設計ですが、いつもは Neural Network Console に初めから登録されているサンプルプロジェクトから適当なものを選び、修正して使っているのですが、今回は過去に発表された有名なモデルを参考に、オリジナルを作ってみたいと思います。
参考にするのは、画像認識の世界で革命を起こし、ディープラーニングブームの火付け役となった、Alexnet です。
Alexnet とは?
Alexnet は画像認識コンテスト ILSVRC で2012年に優勝し、画像認識の世界に革命を起こしたニューラルネットワークです。
何が凄いかと言うと、Alexnet の出現によって画像認識の考え方が180度変わりました。
それまでの画像認識は人が画像の特徴を見つけ出しプログラムを書いて機械に覚えさせていたのですが、Alexnet は人は機械に大量の画像を見せるだけで機械が画像の特徴を見つけ出して覚えるんです。
そしてその性能がまた凄い。それまでの機械の認識率は技術者の職人芸的プログラミングで毎年1~2%づつ改善するものだと考えられていたのが、Alexnet は、前年よりいっきに10%の改善をし2位以下に大差を付けてぶっちぎりで優勝したのです。
Alexnet 以降、画像認識はディープラーニング一辺倒になり、その将来性に目を付けたGoogle やFacebookは、ディープラーニングを研究している会社をどどん買収して行きました。
さて、その設計図を見てみましょう。
入力はカラー224×224ピクセルで、そこから後が上下に分かれ上の方は図が切れていますが、上下は同じものです。
2つに分かれている理由は、2012年当時のGPUの性能から、全部を1枚のGPUに載せることはできなかったので、2枚に分けたということらしいです。
2枚をまとめて考えると、224×224(3枚)の画像は、畳み込み1で 55×55(96枚)、畳み込み2+プーリングで 27×27(256枚)、畳み込み3+プーリングで 13×13(384枚)、畳み込み4で 13×13(384枚)、畳み込み5で 13×13(256枚)、その後プーリングで全結合層に繋がっています。
画像認識コンテスト ILSVRCでは、1,000種類の画像分類をするので、最後の全結合層は1,000になっています。
特徴的なのは、224×224の画像を13×13まで縮小して、3段の畳み込みを掛けているところでしょうか。
また、この設計図には記載はありませんが、4,096の2つの全結合層には Dropout が入っていて過学習を防いでいます。
後、Webを見ていると、入力の 224×224 は 227×227の間違いではないかとの情報が多々ありましたが、これは一理あります。
1段目の畳み込みは、フィルター11×11、ストライド4ですので、227×227なら、(227―11)/4+1=55で2つ目の画像サイズに合いますが、224×224 ではパディングしても計算が合いません。
しかし、 ILSVRC のコンテストの画像は 224×224 なのです。わざわざ入力を227×227にするでしょうか。もしかすると、畳み込みの設定が違うのかもしれませんが、このあたりは謎です(笑)。
ミニ Alexnet を設計します
一番の問題は入力サイズが大きく異なることです。Alexnet は224×224、CIFAR-10は32×32 でなんと1/7しかないです。
もう1つは、計算パワーの問題。私のGPU無しの環境(MacbookAir)では、フィルターの枚数はある程度落とさざるを得ないです。
では、オリジナルの設計図を真似て、Mini_Alexnet の設計図を書いてみます。
色々考えた結果がこれ。1段目の畳み込みは、2~5段目と同じく、フェイルター3×3、パディング1、ストライド1で、畳み込みをしてもサイズは変えない仕様にしてます。
プーリングが3段入るので、32→16→8→4と縮小され、全結合層に入る時には4×4ピクセルになってしまいますが、まあ良しとしましょう。
後、畳み込み1と畳み込み2にはBatchNormalizationを追加しています。
一応、これで5段の畳み込み層と3段のプーリング層は確保しました(笑い)。
それでは、Neural Network Console を入力する設定をまとめてみます。
Kernel Shape はフィルターのことですね。ここに記載の無い設定値は、Neural Network Console のデフォルト値です。
Neural Network Console へ入力するとこんな形になります。ReUL_4 とConvolution_5 の間が切れていますが、これは画面をキャプチャーする時の関係でこうなっていますが、もちろん実際は繋がっています(笑)。
学習・評価結果
さて、とりあえず動かしてみます。結構重そうなプログラですので、まずEpoch5で学習スタートします。
5epoch の学習時間は3時間16分で、1epoch 当たり39分。結構重いです。
とりあえず順調に学習はスタートできているという感じです。
評価後のConfusion Matrix です。精度は73.07%でした。
画面キャプチャーでは、全体像が見にくいので、画面上で右クリックし、Save CSV as … でCSVファイルに書き出し、Calcで読み込んで全体像を見てみます。
calc で開いたのがこれです。
識別率が一番良いのはy:label=9(トラック) で、一番苦戦しているのがy:label3(猫)です。どんな画像を間違えているのか、ちょっと見てみましょう。
写真の上の数字は画像サンプルのNo. 下は何に間違えたか、をまとめました。
No.61を犬に間違えるのは修業が足りないということだと思いますが、No.8は猫の雰囲気は分かりますが詳細は良くわからない、No.53は頭を下にしてあくびをしているんでしょうか。
極めつけは、No.68 で、これは私でも犬に間違えます。というか、これって画像データの振り分けを間違えてない?
もうちょっと見てみましょう。No.91をカエルに間違えているのは笑えます。No.106は、なぜ船と間違えるのか分かりませんが、何か棒のようなものに乗っているのを勘違いしているのかな。No.78とNo.143は、雰囲気だけで、結構難しそう。
いやー、CIFAR-10には、人間にとっても結構識別が難しいものが入っています。
さて、いよいよ本格的に学習・評価をやってみるわけですが、1Epoch当たり39分掛かるとすると、100epoch では 39分×100epoch=3,900分(65時間)で、約3日間 MacbookAir は動かしっぱなしにしなければならない。
うーん、ちょっとそれはねー。でも、せっかくMini_Alexnetを作ったんで試してみたい。と、考えていたら、良いアイディアがわいて来ました。
最近、SONYさんが始めた、Neural Network Console のクラウドのβ版を使ってみようと。あれなら、私のMacbookAir よりも高速なはずだし、今なら10時間分は無料なので、やってみることにしました。
SONY Neural Network Console のクラウド版を使ってみる
早速、ホームページに行き、メール、パスワード、生年月日を登録すれば、直ぐメールが送られて来ますので、確認を押せば、直ぐ使えます。
まずは、ここからデータセットアップロードツールをダウンロードします。使い方は、解凍するだけで、特にインストールの必要はなく、そのままダブルクリックで動きます。
Dataset 画面で、「Upload Dataset」ボタンを押します。
すると、ハッシュ CODEが現れますので、これをコピーします。
アップローダーツールを起動して、右上の「Paste」ボタンを押すと、ハッシュCODEが設定されます。続いて、右上の「Select」ボタンを押して、アップロードするファイルを選びます。
「Select」ボタンを押して選ぶのは、学習ファイルと評価ファイルだけです。
まず、学習ファイル(cifar10_training.csv)を選択し、「start」ボタンを押します。後は、学習ファイルに紐づいた画像はまとめて圧縮されて、自動的にアップロードされます。これは中々便利。
評価ファイルの方も、同様にアップロードします。
アップロードしたら、直ぐDataset 画面に登録されるのではなく、内部処理を行ってから登録になるようです。
学習ファイルの方は、200MB弱(画像ファイル含む)あるので、結構時間がかかり、1時間強くらい待たされました。完了すると、こんな風にDataset 画面に表示されます。
後は、アプリ版の Nueral Network Console と同じなので省略です。
早速、大胆にもEpoch100で学習スタートします。これは学習のログです。
ログで見ていると、まず学習ファイルと評価ファイルのCash作成に44分、1epoch 進むのに43分掛かります。
よく見てみたら、‘ CPU ‘ :[ ‘ default ‘ ] と表示されています。そういえば、β版の無料サービスはGPU無しでした(そりゃそうだよね)。
それにしても、私のMacbbokAir より遅いじゃん(私のMacbbokAir は1epoch 39分)!
この調子でやっていると、タイムリミットの10時間までやっても、12 epochくらいまでしか行かずに終了です。急遽作戦変更し、10epoch 設定で、再度学習再開です。
さて学習結果は?
学習結果がこれです。所要時間は、10epoch で6時間36分(1epoch当たり39.6分)、ほぼ私のMacbookAir と同等なスピード。
Training Error (学習誤差)の方は順調に下がっていますが、Varidation Error(評価誤差)の方は、5epoch からあまり下がっていません。
Confusion Matrix です。精度は74.26%で、アプリ版の5epoch の時の精度 73.07% からは、+1.19しか改善されていません。もうそろそろ打ち止めが近いって感じでしょうか。
ダッシュボード画面です。Cashの作成+1回目のトライの断念+今回の学習・評価で、10時間のリミットに対して、既に8.3時間使用済となりました。お疲れ様でした。
クラウド版に期待していたのですが、やってみた感触は、MacbookAir がクラウド上にもう一台増えたといった感じです。epoch 毎に細かく学習結果をみたい場合には、作業効率アップのために使えると思いますが、それ以外はあまり。
有償になっても、ちゃんとGPUが使えて、それなりの料金なら使うことを検討しますので、SONYさんヨロシク(笑)。
アプリ版で再度やってみる
なんか中途半端感で一杯になったので、アプリ版 Neural Network Console で 20epoch 設定で夕方に学習スタートさせ、翌朝見てみました。
Training Error (学習誤差)はドンドン下がって行きますが、Varidation Error(評価誤差)は、10epoch から逆に若干上がってしまいました。
Confusion Matrix です。精度75.53%、5epoch の時より+2.46、10epochの時より+1.27 改善されています。
まだとりあえず、改善は進んでいる状況です。もうちょっとやってみたい感じもありますが、まあこの辺で打ち止めにしときます。
項目別の改善度をみてみましょう。
おおっ!一番苦戦していた猫が+14.0ジャンプアップ! その一方で▲9.5悪化したトラックもありますが(汗;)
それでは、5epochで間違えていた例の8枚の識別結果を見てみましょう。
おおっ!3つは猫と判断できるようになりました。だけどねー、No.61を犬とまだ間違えるのが、よくわからん。人間なら、この中では一番簡単だと思うが。
こちらは、2つ猫だと判断できるようになりました。No.106みたいに、他の物体に乗っているのは難しいようですね。
Webの情報を元に、mini_Alexnet を設計するのは、自分にとってかなり勉強になりました。曖昧なまま覚えていた知識が整理された感じで、結構充実感があります。
では、また。
どうもありがとうございました。
このブログのお陰で、とても助かります。
学習したモデルをセーブすることは可能ですか?TensorflowではcPickleという形式で学習モデルを保存するらしいですが、もしSony Neural Network Consoleにもそのような機能があったら、紹介してください。
よろしくお願いします。
Kotaiさんへ
コメントありがとうございます!
Neural Network Console は 学習を完了すると自動的に parameters.h5 という学習ファイル(重みが記録されている)を作ります。
また、推論に用いるネットワークはExport機能でpython codeに書き出せます。
この学習ファイルとpython codeを利用して、Python環境やc++環境で、推論のみの実行が出来ます。
よろしくお願い致します。