粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

Kerasで機械学習のモデルの保存と可視化

環境

Python3.5 の仮想環境をWindows64bit上に立てております。
環境が違う人はエラーが起こるかと。

また,基本的なコードはKerasを用います。Kerasの便利さに感動したのでしばらくTensorflowの書き方で書くことはないかも?

今回は気分で参考文献を先に挙げておきます。
www.mathgram.xyz
以下のスライドシェアの記事にはお世話になりました。
Kerasで可視化いろいろ

ここにあるLossの時系列プロットなども気が向いたら書きます。
はじめての Deep Learning - Keras で MLP for MNIST · m0t0k1ch1st0ry


作成したモデルの図示

Kerasで作成したモデルを図示する手法を紹介します。
私の環境はconda-forgeから入れた2.02が標準として使われているようです。

Kerasの設定に関して

Kerasの設定ですが,バックエンドをTensorflowで行います。その際,仮想環境を用いている方は罠にハマりうるので以下の記事に目を通しておいたほうがいいかもしれません。
ossyaritoori.hatenablog.com

モデルの図示のための下準備

vis_utilsのplot_modelというクラスを使います。
なお,こういう名前はバージョンが変わるごとにコロコロ変わっていくので注意が必要です。
少ししたらplot_mdlとかいう名前になっていそう…

pydotとgraphvizという2つのパッケージに依存するのでこいつらを入れて回ります。


パッケージの導入はいつものとおりなのでいろいろすっ飛ばすと
Anacondaの仮想環境上でのパッケージ確認と追加の方法について - 粗大メモ置き場

 conda install --channel https://conda.anaconda.org/conda-forge graphviz

これして

conda install --channel https://conda.anaconda.org/dhirschfeld pydot

こう。後半のpydotは3.5系かつwindwos64に入るものが少なくて掘り当てるのに苦労しました。


ただ,おそらく以下のエラーが出ます。
「Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.」
ということでこいつらを入れて回ります。

いろいろすっ飛ばすと

 conda install --channel https://conda.anaconda.org/conda-forge graphviz

これして

conda install --channel https://conda.anaconda.org/dhirschfeld pydot

こう。後半のpydotは3.5系かつwindwos64に入るものが少なくて苦労しました。

なお,直すところはまだまだあります^^

実行用コード

実際のコードにおいては,modelを記述した後に,

from keras.utils.vis_utils import plot_model
plot_model(model, to_file='model.png')

とすることでmodelを保存できます。

この際に

module ‘pydot’ has no attribute ‘find_graphviz

というエラーがでるはずです。これは正直古いパッケージを参照している証左なので,以下の手順で直します。

① 該当箇所のコメントアウト
Anaconda3フォルダ配下の"Lib\site-packages\keras\utils"にvisualize_util.pyがあります。このファイルのfind_graphvizを使っている13-15行目を以下のようにコメントアウトしましょう。

#if not pydot.find_graphviz():
#    raise ImportError('Failed to import pydot. You must install pydot'
#                      ' and graphviz for `pydotprint` to work.')

環境変数の追加
Anaconda3フォルダ配下の"Library\bin\graphviz"を環境変数のPATHに追加し、PCを再起動しましょう。
仮想環境で開発をしている場合はすべてenv以下のLibraryを参照するように。

正直このバグは公式で早く直してほしいところです。

以下のサイトが同様の内容についてコメントしています。
【Python】 Kerasでモデルを図に保存する - 旅行好きなソフトエンジニアの備忘録

モデルの図示結果

正直こんだけ頑張ってこれかよ…と思わなくもないですが,一応こんな感じに図が出ます。
f:id:ossyaritoori:20170602005520p:plain


学習した畳み込み層の図示

畳み込みネットワークといえば,層を図示してこういう特徴を学習したと自慢したいですよね。
それ,Kerasで結構楽にできます。

層の出力の結果

なーんかよく見るそれっぽい図です。これが畳み込みネットワークが学習した特徴というやつになります。

1層目 64カーネル
f:id:ossyaritoori:20170601211746p:plain
2層目 32カーネル
f:id:ossyaritoori:20170601212851p:plain

下準備

基本的なmatplotlibなどを用いれば作成できますが,最大値と最小値のスケーリングにおいてsklearnというパッケージを用います。

インストールするのは「scikit-learn」というパッケージです。2017年6月では以下からダウンロード可能です。

 conda install --channel https://conda.anaconda.org/Anaconda-Extras scikit-learn

書き方

以下のように書きます。

layer_num = 0; # 1st convolutional layer
print('Layer Name: {}'.format(model.layers[layer_num].get_config()['name']))
W = model.layers[layer_num].get_weights()[0]

W=W.transpose(3,2,0,1)
nb_filter, nb_channel, nb_row, nb_col = W.shape

#plot
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
plt.figure()
for i in range(nb_filter):
    im = W[i,0]
    # scaling images 
    scaler = MinMaxScaler(feature_range=(0,255))
    im = scaler.fit_transform(im)
    
    plt.subplot(8,8,i+1)
    plt.axis('off')
    plt.imshow(im,cmap='gray')
plt.show()
  • model.layers[x]でx+1番目のレイヤー情報を見れます。
  • その後,get_weightという関数で畳み込み層のカーネルを行列としてWに書き出します。
  • Wは((カーネルサイズ),(入力数,出力数))の4次元なので便宜のために順番を入れ替えます。
  • その後subfigureを開いてカーネルの要素数だけ並べてplotします。

非常に簡単で助かります。

実行コード

今回もMNISTを使って学習をしています。
コードには先程の図示の他,前回扱った各変数の保存なども組み込んでおきました。

このコードがスッキリ動く環境になればわりと何でもできそうです。


それではよい生涯学習ライフを!