頭が混乱・・・
Kerasで機械学習モデルの保存と読み見込み:json・pickle・pkl・hdf5・h5?
機械学習プログラミングのサンプルコードなどを学習していると
・json・pickle・pkl・hdf5・h5…
などと、Kerasの機械学習のモデル構造・学習モデルの重み(パラメータ)の保存方法や、拡張子の違いなどがあるようでしたので、頭が混乱する方もいるのではないかと思います。
このページには、自分のような機械学習初学者の方の情報収集の利便性を考え、Kerasで機械学習をさせる際のモデルの保存と読み込み方法について整理しておきます。
機械学習の疑問:JSONとは?JSON形式ファイルの保存と読み込み
機械学習のモデル構造・アーキテクチャを保存
#JSON形式ファイルの保存
from keras.models import model_from_json
open('model.json','w').write(model.to_json())
#コード解説
:「model.json」という名前で機械学習の「モデル構造・アーキテクチャを保存」。重み(パラメータ)は含まない。
JSON(ジェイソン:JavaScript Object Notation)は、データ記述言語の1つで、プログラミング言語を問わず利用できる軽量のデータ交換フォーマットのようです。
機械学習のモデル構造・アーキテクチャを読み込み
#JSON形式ファイルの読み込み
from keras.models import model_from_json
model_from_json(open('model.json',"w").read(model.to_json()))
#コード解説
:「model.json」という名前で機械学習のモデル構造・アーキテクチャを読み込む。
JSONの説明ページ
:JSON | json.org
機械学習の疑問:hdf5・h5とは?HDF5形式ファイルの保存と読み込み
1-1 機械学習の学習済みの重みを保存
#HDF5形式ファイルの保存
model.save_weights('weight.h5')
model.save_weights('weight.hdf5')
#コード解説
:「weight.h5」(または、「weight.hdf5」)という名前で機械学習の「学習済みの重み」(パラメータ)を保存。
読み込みの際の識別用に「h5拡張子」と「hdf5拡張子」の違いがありますが、同じHDF5(エッチディーエフ ファイブ:Hierarchical Data Format Version 5 – 階層的データ形式バージョン5)のことをさすようです。
1-2 機械学習の学習済みの重みを読み込み
#HDF5形式のファイルの読み込み
model.load_weights('weight.h5')
model.load_weights('weight.hdf5')
#コード解説
:「weight.h5」(または、「weight.hdf5」)という名前で機械学習の「学習済みの重み」を読み込む。
2-1 機械学習の学習済みモデルの保存(学習済みの重みも含む)
model.save('model.h5')
model.save('model.hdf5')
#コード解説
:「model.h5」(または、「model.hdf5」)という名前で機械学習の「学習済みモデル」を保存。(学習済みの重みも含む)
2-2 機械学習の学習済みモデルの読み込み(学習済みの重みも含む)
from keras.models import load_model
model = load_model('model.h5')
from keras.models import load_model
model = load_model('model.hdf5')
#コード解説
:「model.h5」(または、「model.hdf5」)という名前で機械学習の「学習済みモデル」を読み込む。(学習済みの重みも含む)
HDF5形式ファイルでの機械学習の「モデル構造」や学習済みの「重み」の保存の違いを知っておけば、以下のエラーが起きても対応できそうですね。
:【対応例】ValueError: No model found in config file
HDF5についての説明
:THE HDF5 LIBRARY & FILE FORMAT | The HDF Group
機械学習の疑問:pickle・pklとは?pickle形式ファイルの保存と読み込み
機械学習の学習済みモデルを保存(おそらく…学習済みの重みも含む?)
#pickle形式ファイルの保存
import pickle
with open('model.pkl', 'wb') as f:
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
import pickle
with open('model.pickle', 'wb') as f:
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
#コード解説
:「model.pkl」(または、「model.pickle」)という名前で機械学習の「学習済みのモデル」を保存。(おそらく…学習済みの重みも含む?)
pickelはPythonのモジュールのようです。「wb」を指定することでバイナリ形式でファイルが保存されます。
「pickle.HIGHEST_PROTOCOL」とすることでプロトコルバージョンを高いものに指定してpickleファイルを作成しています。
HDF5形式のファイルと同様にpickleは「pickle拡張子」「pkl拡張子」の違いがありますが、同じpickleファイルのようです。
参考情報として、2021年2月確認時点では「Keras Documentation」の情報によると
Keras modelを保存するには?
モデル全体の保存/読み込み(アーキテクチャ + 重み + オプティマイザの状態)Kerasのモデルを保存するのに,pickleやcPickleを使うことは推奨されません.
出典:
Keras Documentation
Keras modelを保存するには?
2021年2月1日利用
ということでKerasモデルを保存するのは、非推奨とのことでした。
情報を調べてみると、保存形式には色々な形式があるようでしたが、ファイル形式によって、
・容量
・保存する時間
などにも違いがあるそうです。(まだ探求できていませんが…)
機械学習の学習済みモデルを読み込み(おそらく…学習済みの重みも含む?)
#pickle形式ファイルの読み込み
import pickle
with open('model.pkl', 'rb') as f:
data = pickle.load(f)
import pickle
with open('model.pickle', 'rb') as f:
data = pickle.load(f)
#コード解説
:「model.pkl」(または、「model.pickle」)という名前で機械学習の「学習済みモデル」を読み込む。(おそらく…学習済みの重みも含む?)
「Keras Documentation」的にはpickleは非推奨ということで、あまり深く調べていませんが、Kerasのサンプルコードによっては
・HDF5形式ファイル
・pickle形式ファイル
の両方を保存している場合も散見しています。
また、必要に迫られたら追求していきたいと思います。
Python Documentationのpickleの説明ページ
:pickle — Python オブジェクトの直列化 | Python
Google Colaboratoryで、すぐに使える「機械学習モデル・重みの保存と読み込み」が出来るサンプルコード(Keras・CNN・自作AI用)
【オリジナルデータセットで機械学習に挑戦】
クラウド上で無料で使えるJupyterノートブック環境「 Google Colaboratory 」でKerasを使って自作・自前画像で画像認識が出来るように、ディープラーニング(深層学習)でおなじみの「畳み込みニューラルネットワーク」(CNN:Convolutional Neural Network)のプログラミングをしてみました。機械学習モデルの畳み込みニューラルネットワークを実装する際に「モデル構造の保存と読み込み:json」「学習済みの重みの保存と読み込み:h5」を使い「認識させたい画像の判定」が出来るようにしています。
機械学習・人工知能プログラミングのオリジナルデータセットの壁を感じている方も多いのではないかと思います。
コード解説もしておきましたので、日々の学習にお役立てください。(オフラインでも学習しやすいように記事の内容を、PDFで公開してあります)
:【サンプルコード】Python・KerasでCNN機械学習。自作・自前画像のオリジナルデータセットで画像認識入門
:【コード解説】自作画像認識AI:Keras・CNN・Pythonオリジナルデータセット対応の機械学習サンプルコード
また、上記のサンプルコードを理解するために必要な画像認識関連の深層学習プログラミングの知識を学ぶ上で補助教材となりそうな書籍をレビューしておきました。日々の学習の一助になることがありましたら幸いです。
:【1周目 – 学習レビュー】Pythonで動かして学ぶ!あたらしい深層学習の教科書 機械学習の基本から深層学習まで(Aidemy公式教科書)