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でモデルを図に保存する - 旅行好きなソフトエンジニアの備忘録
モデルの図示結果
正直こんだけ頑張ってこれかよ…と思わなくもないですが,一応こんな感じに図が出ます。
学習した畳み込み層の図示
畳み込みネットワークといえば,層を図示してこういう特徴を学習したと自慢したいですよね。
それ,Kerasで結構楽にできます。
下準備
基本的な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を使って学習をしています。
コードには先程の図示の他,前回扱った各変数の保存なども組み込んでおきました。
このコードがスッキリ動く環境になればわりと何でもできそうです。
書籍
基礎知識をつけるには最低限これは読んでおくと良いでしょう。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (18件) を見る
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~
- 作者: 巣籠悠輔
- 出版社/メーカー: マイナビ出版
- 発売日: 2017/05/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
- 作者: 島田直希,大浦健志
- 出版社/メーカー: 技術評論社
- 発売日: 2017/09/14
- メディア: 大型本
- この商品を含むブログを見る