学習モデルの可視化と学習の様子を可視化してみた
こんにちは。
AI coordinatorの清水秀樹です。
何を今更といった内容の記事です。
DeepLearningにチャレンジしてきた筆者ですが、今まで真面目に可視化方法について調べてきませんでした。
可視化できなくてもいいや!って思っていましたが、個人の活動でDeepLearningについてのセミナーを開くことになったので、真面目目に可視化方法についてチャレンジしてみることにしました。
割と簡単にできたので、興味がある方は参考にしてみてください。
開発環境
iMac (27-inch, Late 2012)
プロセッサ 2.9 GHz intel Core i5
macOS Sierra バージョン 10.12.4
Anaconda3-4.2.0-MacOSX-x86_64
python 3.5.2
tensorflow 1.0.0
keras 1.2.2
参考にさせて頂いたサイトの紹介
簡単にできたとはいえ、下記サイトを参考にさせて頂いたから簡単にできたわけで、これらのサイトがなかったら多分できませんでした。
情報提供有難うございます。
学習モデルの可視化については以下のサイトを参考にしました。
学習の様子は以下のサイト参考にさせて頂きました。
これらのサイトを参考に以下のモジュールをインストールしています。
$ pip install pydot $ pip install pydot-ng $ conda install graphviz
また、これからDeep Learningの勉強をするなら、こちらで紹介する書籍も参考になりますので一読してみることをオススメします。
cifar10で学習モデルと学習の様子を可視化
以下サンプルコードです。
環境が整っていれば、ソースコードに手を加えずとも学習モデルの可視化と学習の様子の可視化ができるはずです。
# coding:utf-8 import numpy as np import scipy.misc import tensorflow as tf from keras.utils import np_utils from keras.models import Sequential, Model, model_from_json from keras.layers.core import Dense, Activation, Flatten, Dropout from keras.layers.convolutional import Convolution2D from keras.layers.convolutional import MaxPooling2D from keras.optimizers import SGD from keras.layers.normalization import BatchNormalization from keras.callbacks import EarlyStopping, TensorBoard, ModelCheckpoint from keras.datasets import cifar10 from keras.utils.visualize_util import plot import keras.backend.tensorflow_backend as KTF import matplotlib.pyplot as plt #1024個の一層目を定義 in_shape = (32, 32, 3) #縦、横、RGB #クラスを指定 categories = ["airplane","automobile","bird","cat","deer","dog","frog","horse","ship","truck"] nub_classes = len(categories) #モデルの作成 def build_model(): model = Sequential() #畳み込み層の作成 #1層目の追加 1024個の層を最初に作り、フィルター3*3のフィルターを16個作成 model.add(Convolution2D(16, 3, 3, border_mode="same", input_shape=in_shape)) model.add(Activation("relu")) #2層目の畳み込み層 model.add(Convolution2D(16, 3, 3, border_mode="same")) model.add(Activation("relu")) #プーリング層 model.add(MaxPooling2D()) #Dropoutとは過学習を防ぐためのもの 0.5は次のニューロンへのパスをランダムに半分にするという意味 model.add(Dropout(0.5)) #3層目の作成 model.add(Convolution2D(32, 3, 3, border_mode="same")) model.add(Activation("relu")) #4層目の作成 model.add(Convolution2D(32, 3, 3, border_mode="same")) model.add(Activation("relu")) #プーリング層 model.add(MaxPooling2D()) model.add(Dropout(0.5)) #5層目 model.add(Convolution2D(64, 3, 3, border_mode="same")) model.add(Activation("relu")) #6層目 model.add(Convolution2D(64, 3, 3, border_mode="same")) model.add(Activation("relu")) #プーリング層 model.add(MaxPooling2D()) #Dropout model.add(Dropout(0.5)) #7層目 model.add(Convolution2D(128, 3, 3, border_mode="same")) model.add(Activation("relu")) #Dropout model.add(Dropout(0.5)) #平坦化 model.add(Flatten()) #8層目 全結合層 FC model.add(Dense(100)) model.add(Activation("relu")) #Dropout model.add(Dropout(0.5)) #8層目 引数nub_classesとは分類の数を定義する。 model.add(Dense(nub_classes)) model.add(Activation('softmax')) #ここまででモデルの層完成 #lossは損失関数を定義するところ model.compile(loss="categorical_crossentropy", metrics = ["accuracy"], optimizer = "adam" ) #学習モデル図の作成 plot(model, to_file='model.png') return model def plot_history(history): # 精度の履歴をプロット plt.plot(history.history['acc'],"o-",label="accuracy") plt.plot(history.history['val_acc'],"o-",label="val_acc") plt.title('model accuracy') plt.xlabel('epoch') plt.ylabel('accuracy') plt.legend(loc="lower right") plt.show() # 損失の履歴をプロット plt.plot(history.history['loss'],"o-",label="loss",) plt.plot(history.history['val_loss'],"o-",label="val_loss") plt.title('model loss') plt.xlabel('epoch') plt.ylabel('loss') plt.legend(loc='lower right') plt.show() if __name__ == "__main__": #ここに読み込み処理と関数呼び出しを行う #cifar10からデータを取得 10種類の画像データセットがある 計5万枚 (X_train, y_train), (X_test, y_test) = cifar10.load_data() print(X_train.shape, y_train.shape) print(X_test.shape, y_test.shape) y_train = np_utils.to_categorical(y_train) y_test = np_utils.to_categorical(y_test) X_train = X_train.astype('float32') / 255 X_test = X_test.astype('float32') / 255 print("X_train", X_train.shape) print("y_train", y_train.shape) print("X_test", X_test.shape) print("y_test", y_test.shape) #ここからが上記で作成したモデルを呼び出す処理 model = build_model() history = model.fit(X_train, y_train, nb_epoch=50, #学習させる回数 今回は10 回数はお好みで pythonのnb_epochとはrangeの繰り返しのこと batch_size=500, #無作為に何枚学習に使用するか決定する。数字はなんでも良い validation_data=(X_test, y_test) ) #学習モデルの保存 json_string = model.to_json() #モデルのファイル名 拡張子.json open('cifar10.json', 'w').write(json_string) #重みファイルの保存 拡張子がhdf5 model.save_weights('cifar10.hdf5') # モデルの評価evaluate score = model.evaluate(X_train, y_train) print("test loss", score[0]) print("test acc", score[1]) # modelに学習させた時の変化の様子をplot plot_history(history)
上記ソースコードでできた学習モデルの可視化はこんな感じでした。
学習の様子は以下のような画像で表示されます。
epoch = 50 程度なら過学習も起きずにうまく学習できているみたいですね。
ちなみepoch = 500 にした結果は以下の通り。
あまり変わらない?感じですかね。
ちなみにGPUを使用していないため、epoch = 500 は丸1日かかりました。
その他のDeepLearning記事はこちらから
それではまた。
この記事へのコメントはありません。