以下で絶対パスを確認できるので、ファイルの存在を確認してください。
python
1import os
2os.path.abspath(PATH + "/model.json")
モデル構造及び重みの保存方法
Keras にはモデル構造及び重みの保存方法は以下があります。
model.save(): 保存
model = load_model(): 読み込み
model.save_weights(): 保存
model.load_weights(): 読み込み
json_string = model.to_json(): 保存
model = model_from_json(json_string): 読み込み
yaml_string = model.to_yaml()
model = model_from_yaml(yaml_string)
モデルの保存 (ModelCheckpoint で最良のモデルのみ保存する。)
import os
import time
import numpy as np
from keras.callbacks import ModelCheckpoint
from keras.datasets import mnist
from keras.layers import Activation, BatchNormalization, Dense
from keras.models import Sequential
from keras.utils.np_utils import to_categorical
# MNIST データを取得する。
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 1次元配列にする。 (28, 28) -> (784,) にする
x_train = x_train.reshape(len(x_train), -1)
x_test = x_test.reshape(len(x_test), -1)
# one-hot 表現に変換する。
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
# モデルを作成する。
model = Sequential()
model.add(Dense(10, input_dim=784))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dense(10))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dense(10))
model.add(BatchNormalization())
model.add(Activation('softmax'))
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 学習する。
save_path = os.path.join('models', time.strftime("%Y%m%d-%H%M%S")) # 保存するディレクトリ
os.makedirs(save_path, exist_ok=True)
model_checkpoint = ModelCheckpoint(
filepath=os.path.join(save_path, 'model_{epoch:02d}_{val_loss:.2f}.h5'),
monitor='val_loss',
save_best_only=True,
verbose=1)
model.fit(x_train, y_train, epochs=10, batch_size=128,
validation_data=(x_test, y_test),
callbacks=[model_checkpoint])
以下のように models ディレクトリ以下に現在の時刻でフォルダが作成され、その下に重みファイルが保存されます。
models
`-- 20181025-022510
|-- model_01_0.55.h5
|-- model_02_0.35.h5
|-- model_03_0.30.h5
|-- model_04_0.27.h5
|-- model_05_0.25.h5
|-- model_06_0.24.h5
|-- model_07_0.22.h5
|-- model_09_0.22.h5
`-- model_10_0.22.h5
読み込むとき
モデル構造は、save_json(), load_from_json() を使ってもいいですが、モデルがわかっているのであれば、それを構築して、model.load_weights() で重みだけ読み込めばよいです。
# 一番新しいモデルのパスを取得する。
import glob
model_paths = glob.glob(os.path.join(save_path, 'model_*.h5'))
last_model_path = sorted(model_paths, reverse=True)[0]
print('loading weights...', last_model_path)
# モデルを作成する。
model = Sequential()
model.add(Dense(10, input_dim=784))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dense(10))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dense(10))
model.add(BatchNormalization())
model.add(Activation('softmax'))
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 重みを読み込む。
model.load_weights(last_model_path)
loss, acc = model.evaluate(x_train, y_train)
print('Loss: {}, Accuracy: {}'.format(loss, acc))
loading weights... models/20181025-022510/model_10_0.22.h5
60000/60000 [==============================] - 1s 23us/step
Loss: 0.18432119323263566, Accuracy: 94.75%