Kerasでモデルのsummaryをテキストとして保存する方法
Kerasで「plot_modelを使えばモデルの可視化ができるが、GraphViz入れないといけなかったり、セットアップが面倒くさい!model.summary()のテキストをファイル保存で十分だ!」という場合に使えるテクニックです。
目次
summary()のprint_fn引数を使う
summary()はコンソールに出力するための関数で、出力の文字列を返したりすることはできません(返り値はNoneです)。ただし、print_fn引数を使うと出力先を書き換えることができ、これによりファイル出力ができます。
Kerasのsummary()関数を見ると次のように書かれています。なお、model.summary()はkeras.utils.print_summaryへのショートカットです。
print_fn: 使うためのプリント関数.サマリの各行で呼ばれます.サマリの文字列をキャプチャするためにカスタム関数を指定することもできます.
https://keras.io/ja/utils/#print_summary
ファイルに出力する場合はこうします。
with open("output.txt", "w") as fp:
model.summary(print_fn=lambda x: fp.write(x + "\r\n"))
print_fnにラムダ式をコールバックの形で指定します。行ごとに呼ばれるので、末尾に改行コードをつけないと改行がないテキストファイルが出力されます。改行コードは環境にあわせて切り替えてください(\nにするなど)。
summaryの文字列を取得するには
同じように、summary()の文字列の値を取得するには、io.StringIOを使うとできます。
from io import StringIO
with StringIO() as buf:
# StringIOに書き込む
model.summary(print_fn=lambda x: buf.write(x + "\n"))
# StringIOから取得
text = buf.getvalue()
print(text)
結果的にはmodel.summary()と何ら変わりませんが、一度変数に記録した値を表示しているのが異なるところです。StringIOの使い方については詳しくは公式ドキュメントを参照してください。ちなみに最新バージョンではモジュールがStringIOから、io.StringIOに変わっているのでご注意ください。
https://docs.python.jp/2/library/stringio.html
https://docs.python.org/ja/3.7/library/io.html
関連
- kerasのplot_modelでハマった話
https://qiita.com/hrs1985/items/7d923e9465985d6b8968 - Keras model.summary() object to string
https://stackoverflow.com/questions/41665799/keras-model-summary-object-to-string
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー