強いAIの実現方法 ~実践的な作り方~

強いAIの実践的な作り方を検討しています。メイン記事に主張をまとめています。人工知能関係の書評もあり。なお、今後、任意団体として活動してみたいと考えており、手伝ってみたいという方は是非ご連絡下さい。詳しくは、メイン記事の7を参照下さい。

直感 Deep Learning を読んだ(その2)3章CNN

直感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)の方がほんの少し識別率は高くなっている。

f:id:tomotomo47:20190324184103p:plain

畳み込み20、50

f:id:tomotomo47:20190324184133p:plain

畳み込み10、20

f:id:tomotomo47:20190324184442p:plain

全結合250

 

 畳み込み層の数だけではなくて、畳み込みの形についても、大きさを変える、形を長方形にする等でも結果は変わるかもしれず、いろいろパラメータがありますね。

 

 手書き文字でなくて、10種類の対象が写っている60000枚のデータを分類する有名なCIFARにもチャレンジできる。こちらも正常に動き、おおよそテキスト通りの結果が得られた。ネットワークは、LeNetにドロップアウトを追加したもの、さらに畳み込みを1段増やしたものがある。ネットワークの図だけ載せておく。ドロップアウトを追加しただけでは、あと細かい設定が異なっているが、実行時間はLeNetとあまり変わらなかった。さらに畳み込みを追加した場合、さらに時間がかかった。

 

f:id:tomotomo47:20190324185248p:plain

LeNet

f:id:tomotomo47:20190324185356p:plain

CIFAR用(ドロップアウト追加)

f:id:tomotomo47:20190324185438p:plain

畳み込みを追加