【Python/Keras】学習結果(モデル・重み)の保存・読み込み

Pythonの機械学習モジュール「Keras」で学習結果(モデル・重み)を保存し、読み込む方法をソースコード付きでまとめました。

学習結果の保存・読み込み

前回は、Python3 + Kerasで「AND・OR演算を簡単なニューラルネットモデルで学習」しました。
今回は、その学習結果(モデル・重み)の保存・読み込みを行ってみました。

書式(保存)

# モデルの保存
open('and.json',"w").write(model.to_json())

# 学習済みの重みを保存
model.save_weights('and_weight.hdf5')

上記の部分で、作成したニューラルネットワークの「モデル」と学習した「重み」をそれぞれ保存します。

データ 保存先
モデル and.json
重み(学習済み) and.h5

書式(読込)

# モデルの読み込み
open('and.json',"w").write(model.to_json())

# 重みの読み込み
model.load_weights('and.h5')

サンプルコード

サンプルプログラムのソースコードです。

保存する場合

# -*- coding: utf-8 -*-
import numpy as np
from keras.models import Sequential, model_from_json
from keras.layers.core import Dense
from keras.optimizers import RMSprop

def main():
    # 訓練データの用意
    # 入力データ
    x_train = np.array([[0.0, 0.0],
                        [1.0, 0.0],
                        [0.0, 1.0],
                        [1.0, 1.0]])
    # 入力の教師データ
    y_train = np.array([0.0, 0.0, 0.0, 1.0])

    # モデル構築
    model = Sequential()
    # 入力層
    model.add(Dense(2, activation='sigmoid', input_shape=(2,)))
    # 出力層
    model.add(Dense(1, activation='linear'))
    # コンパイル(勾配法:RMSprop、損失関数:mean_squared_error、評価関数:accuracy)
    model.compile(loss='mean_squared_error', optimizer=RMSprop(), metrics=['accuracy'])
    # 構築したモデルで学習
    history = model.fit(x_train, y_train, batch_size=4, epochs=3000)

    # テストデータの用意
    x_test = x_train
    y_test = y_train
       
    # モデルの性能評価
    score = model.evaluate(x_train, y_train, verbose=0)
    print('Score:', score[0])    # Score: 0.0209678225219
    print('Accuracy:', score[1]) # Accuracy: 1.0

    # モデルの保存
    open('and.json',"w").write(model.to_json())

    # 学習済みの重みを保存
    model.save_weights('and.h5')


if __name__ == '__main__':
    main()

読み込む場合

# -*- coding: utf-8 -*-
import numpy as np
from keras.models import Sequential, model_from_json
from keras.layers.core import Dense
from keras.optimizers import RMSprop

def main():
    # モデルの読み込み
    model = model_from_json(open('and.json', 'r').read())

    # 重みの読み込み
    model.load_weights('and_weight.hdf5')

    # 読み込んだ学習済みモデルで予測
    y = model.predict(np.array([[0, 1]]))
    print(y) # [[ 0.17429274]]

if __name__ == '__main__':
    main()
関連記事
1 Python入門 基本文法
2 【Python/Keras】ディープラーニング入門・使い方
関連記事