Keras+TensorFlowで実践CNN(その5)

Kerasで学習済みモデルを保存する

今回は、これまでトライアルしてきたCNNを使用して、実際に被写体を識別させてみたいとおもいます。

これまでは、トライアル毎にモデルを学習させて、テストデータで予測して精度検証を行ってきましたが、CNNなどの深層学習をCPUで処理させる場合、モデルの学習にとても時間がかかり、毎回学習させるのは煩わしいことです。

そこで、まずはKeras+TensorFlowで学習済みのモデルを保存する方法について解説します。

import keras
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
import h5py

#モデルの設定
model = Sequential()

・・・<中略>・・・

#学習実行
model.fit(train_data, train_label, verbose=1, callbacks=[tb_cb],
nb_epoch=10, batch_size=64)

#モデルを保存する
model.save('wildlife_rgb.h5')

モデルは、学習させてからHDF5フォーマットで保存します。HDF5とは、Hierarchical Data Format5というデータフォーマットの略で、科学技術計算分野などでよく利用されている階層型データフォーマットです。pythonでは、h5pyモジュールをインポートすることで、HDF5フォーマットの読み書きができるようになります。

model.save()メソッドで、学習済みのモデルをHDF5フォーマットでファイルに保存します。引数に出力ファイル名を与えます。HDF5フォーマットの拡張子は一般的には.h5とします。

学習済みモデルを利用して画像を識別してみる

では、次に保存したモデルを使用して実際に画像識別してみます。pythonコードの全体は以下の通りです。

import keras
from keras.models import load_model
from PIL import Image
import numpy as np
import h5py
import sys, os

if len(sys.argv) < = 1:
  print("USAGE: python3.6 caltech101_keras5.py (ファイル名)")
  quit()

#画像カテゴリの設定
categories1 = ["panda","wild_cat","rhino","elephant","flamingo","platypus","okapi","llama",      "kangaroo","hedgehog","emu","beaver"]
categories2 = ["パンダ","ヤマネコ","サイ","象","フラミンゴ","カモノハシ","オカピ","ラマ", "カンガルー","ハリネズミ","エミュ","ビーバー"]

#予測対象の画像を入力形式に変換する
img_width  = 64
img_height = 64
X = []
files = []
for flnmae in sys.argv[1:]:
  img = Image.open(flnmae) 
  img = img.convert("RGB")
  img = img.resize((img_width, img_height))
  data = np.asarray(img)
  X.append(data)
  files.append(flnmae)
X = np.array(X)

#モデルの読込み
model = load_model('wildlife_rgb.h5')

#予測処理
predict = model.predict(X)

#予測結果のhtml文を作成する
out = "" 
for idx, pre in enumerate(predict): 
  y = np.argmax(pre)
  out += "<hr /><h3>入力:" + files[idx] + "</h3>"
  out += "<img src="&quot; + os.path.basename(files[idx]) + &quot;" width="150&lt;/p/" />"
  out += "予測結果:" + categories2[y] + "(" + categories1[y] + ")"
html_out = "<html><body style='text-align:center;'>" + \
           "<style>p{margin:0; padding:0;}</style></body><body>" + out + \
           "</body></html>"

#html文をファイル出力する
with open("CNN_predict_result.html", "w") as f:
  f.write(html_out)

学習済みモデルの読込みは、Kerasのload_model()メソッドで行います。引数には、先ほど学習モデルを保存したHDF5のファイル名を指定します。読み込んだモデルの内容は、model_summary()メソッドで標準出力させることができます。

#モデルの読込み
model = load_model('wildlife_rgb.h5')

#読み込んだモデルのサマリを表示する。
model_summary()

読み込んだモデルは、64×64ピクセルの画像を入力値として学習しているため、入力画像も、64×64ピクセルに変換を行ったのちにnumpy.ndarrayに格納します。

今回のトライアルでは、pythonコードの実行引数に与えられたすべて画像の識別結果をウェブブラウザで表示して確認するようにします。



#予測結果のhtml文を作成する
out = "" 
for idx, pre in enumerate(predict): 
  y = np.argmax(pre)
  out += "<hr /><h3>入力:" + files[idx] + "</h3>"
  out += "<img src="&quot; + os.path.basename(files[idx]) + &quot;" width="150&lt;/p/" />"
  out += "予測結果:" + categories2[y] + "(" + categories1[y] + ")"
html_out = "<html><body style='text-align:center;'>" + \
           "<style>p{margin:0; padding:0;}</style></body><body>" + out + \
           "</body></html>"

#html文をファイル出力する
with open("CNN_predict_result.html", "w") as f:
  f.write(html_out)

画像の識別結果を確認する

pythonコードを実行すると画像の識別が処理され、htmlファイルが出力されます。出力されたHTMLファイルを開くと、以下のように画像識別の結果がされます。

識別結果は甘くない

上野動物園のシャンシャンは、正しくパンダと識別できました。でも、象とフラミンゴは不正解という結果でした。今回のトライアルで使用したCNNモデルの正解率は、学習時では99.3%、検証時は98%でしたので、ほぼ間違いなく被写体を予測できるレベルと考えていましたが、今回のトライアルの正解率は、わずか1/3でした。

比較的に動物の特徴が出やすい画像を抽出したつもりだったのですが、人間の脳では識別できても、人工知能(AI)にとっては簡単ではないことが理解できました。

失敗の原因については、以下のことが考えれれるでしょう。

 ①使用したCNNモデルは、畳み込み層とプーリング層が1層ずつしかない浅いグラフであること。
 ②学習した画像のピクセル数が荒いため、細かなエッジ等の特徴抽出が不十分であること。

今回のまとめ

人間の脳では識別できても、人工知能(AI)にとっては難しいこと、そして改めて人間の脳のすばらしさを実感することができましたね。

最近、経営者層や有識者のあたりで「シンギュラリティ」と言うキーワードがあげられることがあります。シンギュラリティは特異点という意味で、数学的には分母が限りなくゼロに近づくにしたがって無限大に発散するような点のことを言います。要するにブラックホールがこれに相当します。でも、今話題となっているシンギュラリティは、技術的特異点のことを意味しています。

技術的特異点については、アメリカの未来学者で人工知能の権威であるレイ・カーツワイルによって提唱された未来予測の概念です。日本では、ソフトバンクの孫正義社長が「シンギュラリティ」に関する講演を行ない、それ以降、国内でも急速に広まることになりました。

シンギュラリティとは、2045年には人類の英知を結集したテクノロジの進化がエクスポーネンシャル(指数対数的)に変化していく転換点のことを指しています。

レイ・カーツワイルによると、シンギュラリティは2045年に到達すると予測されました。また、2025年頃はプレ・シンギュラリティと呼ばれる変化が顕在化し、この頃から人工知能が人間社会全体に広く浸透し始めると言われています。

シンギュラリティは、日本国内では「人工知能が人間の脳を凌駕していく点」と理解されているようにみえます。しかしながら、レイ・カーツワイルのシンギュラリティの予測については、人工知能(AI)を含むあらゆるテクノロジの進化の展望を広範にとらえた上で説明されているので、単に人工知能が人間の脳を超えていく点という解釈は正確ではないと筆者は考えています。

でも、人工知能が人間の脳を凌駕するのは時間の問題なのかもしれません。そういった意味では、シンギュラリティを「人工知能が人間の脳を凌駕していく点」と解釈しても差し支えないことなのかもしれません。

2045年や2025年は、そんなに遠い未来ではありません。今、地球上に存在する人類の大半が生存しうるリアルな世界です。ここから10年は、プレ・シンギュラリティに向かって人工知能が様々な分野に応用され、急速に社会に浸透することが予測されます。現に2030年ごろのAIマーケットの需要予測は、2兆円とも86兆円とも予測されています。

人類と人工知能を搭載したロボットが共存する世界が実現し始めています。現時点における人工知能は、まだまだイノベータの人手がかかる先進技術ですが、近い将来においては人工知能が人工知能を作るようになると予測する学者などいらっしゃいます。

ロボットがロボットを作る未来感は、映画「ターミネータ」のサーバーダイン社を連想させられます。なんだか恐怖感さえ感じるかもしれません。でも心配することはありません。人工知能開発の現場では、人工知能やロボットを人間の思うとおりに制御し、人間に危害を与えないための研究開発も進められています。

目指す未来は、人類とロボットの共存によって人間がもっと人間らしく生きていける社会です。人工知能の現状について正しく理解しておくことは、シンギュラリティ以降の人類の在り方を方向づけることにつながることなのかもしれません。

次回は、CNNモデルの予測精度を向上させるため、ニューラルネットワークを深化させていこうとおもいます。