https://nine-num-98.blogspot.com/2020/03/ai-hyper-opt-01.html
で少し触れましたが、出来上がったニューラルネットワークモデルの構造を可視化するためのプログラムについて、紹介します。
本プログラムは、以下の環境で動作確認しております。
開発環境
■ハードウェアRaspberry Pi 3 Model B
I-O DATA Raspberry Pi メインボード Bluetooth(R) Wi-Fi対応モデル Raspberry Pi 3 model B 安心の1年間ハードウェア保証 UD-RP3
posted with amazlet at 20.02.15
アイ・オー・データ (2017-02-20)
売り上げランキング: 1,375
売り上げランキング: 1,375
■OS
Raspbian GNU/Linux 9.11 (stretch)
■プログラミング言語、主なライブラリとバージョン
・Python 2.7.13
・Keras 2.1.5
・numpy 1.12.1
・theano 1.0.1
※ラズパイのAI環境開発は以下の本が参考になります。
講談社 (2018-03-14)
売り上げランキング: 72,812
売り上げランキング: 72,812
プログラム解説
GitHubにサンプルプログラムを公開します。
https://github.com/kotetsu99/deep_regression_opt/blob/master/02-dnn_visualization.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import os, sys import keras from keras.preprocessing import image from keras.utils import plot_model def main(): # 環境設定(ディスプレイの出力先をlocalhostにする) os.environ['DISPLAY'] = ':0' # 学習済ファイルの確認 if len(sys.argv)==1: print('使用法: python dnn_visualization.py 学習済ファイル名.h5') sys.exit() savefile = sys.argv[1] # モデルのロード model = keras.models.load_model(savefile) # モデル名 # print("モデル名") print(model.get_layer) # モデルの概要を表示 model.summary() # モデルの概要図をファイル出力 plot_model(model, to_file='model.png', show_shapes=True) if __name__ == '__main__': main()
前回の記事にあった最適化されたハイパーパラメータ内容を確認するために作成したプログラムですが、任意のモデルの構造内容の確認に使えます。ニューラルネットワークモデルの構造をコンソール画面上およびファイルに出力し、可視化することができます。
これはKerasで以下に定義されている、関数を利用します。
・model.summary():
https://keras.io/ja/models/about-keras-models/
・plot_model:
https://keras.io/ja/visualization/
以下にプログラムを使用するコマンドと実行結果例を示します。可視化するモデルは、ハイパーパラメータ最適化の記事で作成したモデルです。
$ python 02-dnn_visualization.py model/dnn_model.h5 Using Theano backend. <bound method Sequential.get_layer of <keras.engine.sequential.Sequential object at 0x721798f0>> _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_63 (Dense) (None, 10) 20 _________________________________________________________________ dropout_46 (Dropout) (None, 10) 0 _________________________________________________________________ dense_64 (Dense) (None, 1) 11 ================================================================= Total params: 31 Trainable params: 31 Non-trainable params: 0 _________________________________________________________________
↑のようにコンソール画面に、簡単なモデルの構成情報を表示します。これは 02-dnn_visualization.py 内にある以下の処理によります。
# モデルの概要を表示 model.summary()
ただ、入力層の情報がなかったりと、若干分かりづらいため、より分かりやすい構成図を画像ファイルとして出力する機能も実装しています。
# モデルの概要図をファイル出力 plot_model(model, to_file='model.png', show_shapes=True)
以下のpngファイルが出力されます。
・model.png

↑のモデル構成内容ですが、
----------------------------------
・入力層
-入力データ数: 1
・中間層
-層数: 1
-ニューロン数: 10
・ドロップアウト層
-層数: 1
・出力層
-ニューロン数: 1
----------------------------------
という構成です。
# 中間層数、中間層ニューロン数のハイパーパラメータは最適モデル通りであることが確認できます。
モデルの詳細な見方ですが、まず一番上のブロックの数字「1914820784」は無視してOKです。2層目のブロック「dense_63:Dense」ですが、これが入力層および、1層目の中間層の情報を示しています。iuputは、中間層の各ニューロンへの入力数(入力層の出力数)を示しています。ここでは1ですね。
outputは、中間層の出力数を示しています。これは、10個のニューロンがあり、それぞれが1個の出力を持つため、合計10個というわけですね。
次に「dropout_46:Dropout」です。これは中間層に続くドロップアウト層です。中間層の出力10個の入力(input)に対し、そのまま10個を出力(output)しているように見えますが、この10個の各出力に対し、一定の確率で出力値を無効(0)とする操作をドロップアウト層で行っています。
最後に「dense_64:Dense」。これは出力層の情報です。前のドロップ層からの10個の出力(出力層への入力)に対し、1個の値を出力します。
以上、モデル可視化プログラムの説明でした。