Kerasモデル可視化:ネットワーク構造をグラフ,図等に出力【ニューラルネットワーク,ディープラーニング,機械学習,Python】

以下の、ハイパーパラメータ最適化に関する記事

https://nine-num-98.blogspot.com/2020/03/ai-hyper-opt-01.html

で少し触れましたが、出来上がったニューラルネットワークモデルの構造を可視化するためのプログラムについて、紹介します。

本プログラムは、以下の環境で動作確認しております。

開発環境

■ハードウェア

Raspberry Pi 3 Model B


■OS

Raspbian GNU/Linux 9.11 (stretch)


■プログラミング言語、主なライブラリとバージョン

・Python 2.7.13
・Keras 2.1.5
・numpy 1.12.1
・theano 1.0.1


※ラズパイのAI環境開発は以下の本が参考になります。


プログラム解説


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個の値を出力します。

以上、モデル可視化プログラムの説明でした。

スポンサーリンク