直感DeepLearning Python×Kerasでアイデアを形にするレシピ
Antonio Gulli 著 2018年 オライリー・ジャパン
前回に引き続き、今回は3章の畳み込みニューラルネットワーク。サンプルプログラムは、windows7、JupyterNotebookで正常に動いた。
前回のニューラルネットワーク基礎でも対象にした手書き数字認識に対し、以下の構造のLeNetを試す。
入力:28×28の手書き数字画像48000枚
畳み込み:5×5のフィルターで20層に畳み込み→28×28×20
※28なのはsame指定のため
プーリング:2×2を1→14×14×20
畳み込み:5×5のフィルターで50層に畳み込み→14×14×50
プーリング:2×2を1→7×7×50
全結合:500個のニューロン
出力:10個の出力層(0~9の数字なので)
細かい結果は異なるが、概ねテキストと同じ結果になった(識別率0.9915)。
ただし、全結合ニューラルネットワークと比べ非常に時間がかかるようになった。1エポック(48000枚学習)に210秒程度を要する。10エポックで30分ぐらいかかる。corei5でGPUも無いノートPCでやっている訳ですが…
時間を減らすために、畳み込みの層を、20→10、50→20にしてみる。時間は1エポックで110秒程度と半分になった。かつ、10エポック経過後の識別率は、学習データとは別の12000毎に対し、0.9915→0.9901とほとんど変わらない。層は多くなくても、CNNの効果は得られるのかもしれない。全結合のニューラルネットより識別率は明らかに高い。
全結合の500個を250個にしてみたが時間は全く変わらない、識別率も0.9903で有意な差は無さそうだった。
3つの方法について、TenorBoardで識別率グラフを出力した。グラフがオートスケールなので比べづらいが、最初の設定(全結合20、50)の方がほんの少し識別率は高くなっている。
畳み込み層の数だけではなくて、畳み込みの形についても、大きさを変える、形を長方形にする等でも結果は変わるかもしれず、いろいろパラメータがありますね。
手書き文字でなくて、10種類の対象が写っている60000枚のデータを分類する有名なCIFARにもチャレンジできる。こちらも正常に動き、おおよそテキスト通りの結果が得られた。ネットワークは、LeNetにドロップアウトを追加したもの、さらに畳み込みを1段増やしたものがある。ネットワークの図だけ載せておく。ドロップアウトを追加しただけでは、あと細かい設定が異なっているが、実行時間はLeNetとあまり変わらなかった。さらに畳み込みを追加した場合、さらに時間がかかった。