公式文書には、「Kirasモデルを保存するためにpickleまたはcPickleを使用することは推奨されていません」とあります。
ただし、Kerasモデルのピクルス化の必要性は、sklearnのRandomizedSearchCV(またはその他のハイパーパラメーターオプティマイザー)を使用したハイパーパラメーター最適化から生じています。結果をファイルに保存することは不可欠です。なぜなら、スクリプトは切り離されたセッションなどでリモートで実行できるからです。
本質的に、私はしたい:
trial_search = RandomizedSearchCV( estimator=keras_model, ... )
pickle.dump( trial_search, open( "trial_search.pickle", "wb" ) )
現在、Kerasモデルはピクル可能です。ただし、model.save()
を使用してモデルをディスクに保存することをお勧めします。
このリンクをご覧ください: DataFrameをHDF5に保存できません(「オブジェクトヘッダーメッセージが大きすぎます」)
#for heavy model architectures, .h5 file is unsupported.
weigh= model.get_weights(); pklfile= "D:/modelweights.pkl"
try:
fpkl= open(pklfile, 'wb') #Python 3
pickle.dump(weigh, fpkl, protocol= pickle.HIGHEST_PROTOCOL)
fpkl.close()
except:
fpkl= open(pklfile, 'w') #Python 2
pickle.dump(weigh, fpkl, protocol= pickle.HIGHEST_PROTOCOL)
fpkl.close()
これは魅力のように機能します http://zachmoshe.com/2017/04/03/pickling-keras-models.html :
_import types
import tempfile
import keras.models
def make_keras_picklable():
def __getstate__(self):
model_str = ""
with tempfile.NamedTemporaryFile(suffix='.hdf5', delete=True) as fd:
keras.models.save_model(self, fd.name, overwrite=True)
model_str = fd.read()
d = { 'model_str': model_str }
return d
def __setstate__(self, state):
with tempfile.NamedTemporaryFile(suffix='.hdf5', delete=True) as fd:
fd.write(state['model_str'])
fd.flush()
model = keras.models.load_model(fd.name)
self.__dict__ = model.__dict__
cls = keras.models.Model
cls.__getstate__ = __getstate__
cls.__setstate__ = __setstate__
make_keras_picklable()
_
PS。循環参照が原因でmodel.to_json()
がTypeError('Not JSON Serializable:', obj)
を上げたため、いくつかの問題が発生しました。このエラーは上記のコードによって何らかの形で飲み込まれたため、pickle関数が永久に実行されました。
Pip経由でインストールできるdeploy-mlモジュールを使用して、Kerasニューラルネットワークをピクルできます。
pip install deploy-ml
Deploy-mlラッパーを使用したkeraニューラルネットワークの完全なトレーニングと展開は次のようになります。
import pandas as pd
from deployml.keras import NeuralNetworkBase
# load data
train = pd.read_csv('example_data.csv')
# define the moel
NN = NeuralNetworkBase(hidden_layers = (7, 3),
first_layer=len(train.keys())-1,
n_classes=len(train.keys())-1)
# define data for the model
NN.data = train
# define the column in the data you're trying to predict
NN.outcome_pointer = 'paid'
# train the model, scale means that it's using a standard
# scaler to scale the data
NN.train(scale=True, batch_size=100)
NN.show_learning_curve()
# display the recall and precision
NN.evaluate_outcome()
# Pickle your model
NN.deploy_model(description='Keras NN',
author="maxwell flitton", organisation='example',
file_name='neural.sav')
Pickledファイルには、モデル、テストからのメトリック、変数名のリストとそれらが入力される順序、Kerasのバージョンとpythonが使用され、使用される場合は、ファイルにも保存されますドキュメントは here です。
import pickle
# use pickle to load the model
loaded_model = pickle.load(open("neural.sav", 'rb'))
# use the scaler to scale your data you want to input
input_data = loaded_model['scaler'].transform([[1, 28, 0, 1, 30]])
# get the prediction
loaded_model['model'].predict(input_data)[0][0]
トレーニングには少し制限があることを感謝しています。 Deploy-mlは、Sk-learn用の独自のモデルのインポートをサポートしていますが、Kerasのこのサポートに引き続き取り組んでいます。ただし、deploy-ml NeuralNetworkBaseオブジェクトを作成し、Deploy-mlの外部で独自のKerasニューラルネットワークを定義し、それをdeploy-mlモデル属性に割り当てると、これがうまく機能することがわかりました。
NN = NeuralNetworkBase(hidden_layers = (7, 3),
first_layer=len(train.keys())-1,
n_classes=len(train.keys())-1)
NN.model = neural_network_you_defined_yourself