質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

8353閲覧

.json形式で保存したモデルを読み込む方法について

Kohei_KESE

総合スコア41

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/10/24 04:29

編集2018/10/24 08:27

Python

1PATH = "AAAA" 2with open(PATH + "/model.json", "r") as f: 3 json = f.read() 4model = model_from_json(json) 5model.load_weights(PATH + "/model_143_0.16.h5")

.json形式で保存したモデルを上記のプログラムで読み込もうとしたのですが、2行目でNo such file or directoryとエラーが出て読み込めませんでした。試しに、jsonファイルをカレントディレクトリに置くと読みこめたのですが、原因が分かりません。どなたか教えて頂きたいです。

追記

Python

1model.compile( 2 optimizer="adam", 3 loss = "mean_squared_error", 4 metrics = ["accuracy"]) 5 6#重みとモデルの保存 7os.makedirs('models', exist_ok=True) 8model_checkpoint = ModelCheckpoint( 9 filepath = os.path.join('models', 'model_{epoch:02d}_{val_loss:.2f}.h5'), 10 monitor = 'val_loss', 11 verbose = 1, 12 period = 1, 13 save_best_only = True) 14 15json_string = model.to_json() 16open('models/mnist_model.json', 'w').write(json_string) 17 18#実行 19history_adam = model.fit( 20 x_train, 21 y_train, 22 batch_size = 32, 23 epochs = 20, 24 validation_split = 0.2, 25# callbacks = [tsb] 26 callbacks = [model_checkpoint])

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzu6

2018/10/24 04:33

ディレクトリ構成を教えてもらえますか?
Kohei_KESE

2018/10/24 04:37

AAAAディレクトリと実行ファイルが同じ階層に置いてあり、AAAAの中に.jsonが置いてあります。
退会済みユーザー

退会済みユーザー

2018/10/24 04:46

ファイルがないといわれているので、おそらくパスの問題ですよね。相対パスになっているので、相対パスの基準が想定したものと異なっていることが考えられます。なので、そのあたりの仕様を一度確認されては?
guest

回答1

0

ベストアンサー

以下で絶対パスを確認できるので、ファイルの存在を確認してください。

python

1import os 2os.path.abspath(PATH + "/model.json")

モデル構造及び重みの保存方法

Keras にはモデル構造及び重みの保存方法は以下があります。

  • 重み + モデル構造 (.h5)

model.save(): 保存
model = load_model(): 読み込み

  • 重み (.h5)

model.save_weights(): 保存
model.load_weights(): 読み込み

  • モデル構造 (.json)

json_string = model.to_json(): 保存
model = model_from_json(json_string): 読み込み

  • モデル構造 (.yaml)

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%

投稿2018/10/24 04:49

編集2018/10/25 02:30
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kohei_KESE

2018/10/24 04:58

実行しましたが、問題無く絶対パスが表示されていると思います。
tiitoi

2018/10/24 05:08

open(PATH + "/model.json", "r") でエラーが出ているということは実際にないということです。 まずパスの結合は os.path.join(PATH, "model.json") としたほうがよいかと思います。 しかし、ファイルがないと言われている以上、実際パスが間違っているのだと思うので、 以下のディレクトリになっていることを確認してください test.py : 実行している Python スクリプト `-- AAAA |-- model.json `-- model_143_0.16.h5
Kohei_KESE

2018/10/24 05:32

model = model_from_json(open(os.path.join(PATH, "model.json"), "r").read())と書き換えて見たところUnknown layer:nameとエラーがでました。 ディレクトリの階層は問題ないと思います。
tiitoi

2018/10/24 06:44

ファイルの読み込みはできるようになったが、パースに失敗しているということだと思います。 回答に追記しましたが、モデルの保存読み込みは model.save() 及び load_model() を使ったほうがよいと思います。 model.save() でモデル構造と重みの両方が保存されるので、load_model() で元のモデルが復元できます。
Kohei_KESE

2018/10/24 08:28

追記のようにcallbackを用いて誤差が小さくなるモデルのみを保存して過学習を防いでいるのですが、model.save()をcallbackに組み込むことは可能なのでしょうか?
Kohei_KESE

2018/10/24 09:18

重みとモデルを分けて保存する方法はわかるのですが、頂いたサイトを見ましてもmodel.saveをmodelCheckpointに組み込む方法がわかりませんでした。 もう少し詳しく教えて頂けないでしょうか。
tiitoi

2018/10/24 09:24 編集

model.fit() 時に modelCheckpoint オブジェクトを渡しておけば、エポックごとに勝手に保存してくれるので、model.save() を組み込む必要はないです。つまり、目的のことを達成するために必要なことは modelCheckpoint オブジェクトを作成して、fit() 関数にわたすだけです。 以下の質問の回答にサンプルコードがあるので、参考にしてください。 https://teratail.com/questions/149999
tiitoi

2018/10/24 09:32

よく見たら前回質問された方でしたね。失礼しました。 前回の質問でエポックごとにバリデーション誤差が改善した場合はモデルを保存するというのを modelCheckpoint コールバックを使って解決されたと思いますが、そのやり方でなにか問題が起きたのでしょうか?
Kohei_KESE

2018/10/24 23:48

前回教えて頂いたコードを流用して使用していたのですが、前述の通り保存先のディレクトリを指定すると保存してあるモデル/重みの読み込みがうまくいかなくて困っています。
Kohei_KESE

2018/10/25 00:23

調べましたら、重みの方はmodel.load_weights("AAAA/model_143_0.16.h5")でディレクトリを指定して読み込むことができました。
tiitoi

2018/10/25 02:32

解答欄に Keras のモデル構造及び重みの保存方法についてまとめました。 あと前回は ModelCheckpoint で最良の結果のモデルを保存する方法を紹介しましたが、読み込む際の方法は紹介していなかったので、合わせて追記しました。 結論からいうと、load_weights() で重みを読み込めばよいです。
Kohei_KESE

2018/10/25 08:23

詳しい解説ありがとうございます。 こちらで色々試したのですが、やはりモデルの読み込みがうまくいかなかったので、カレントディレクトリにモデルを持ってきて、load_weightsだけを使って計算するようにしました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問