DeepLearningのモデル可視化方法とmatplotlibで学習の様子を可視化する方法

学習モデルの可視化と学習の様子を可視化してみた

こんにちは。

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記事はこちらから

 

それではまた。

あなたにオススメの記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP