web-dev-qa-db-ja.com

Kerasモデルをピクルスする方法は?

公式文書には、「Kirasモデルを保存するためにpickleまたはcPickleを使用することは推奨されていません」とあります。

ただし、Kerasモデルのピクルス化の必要性は、sklearnのRandomizedSearchCV(またはその他のハイパーパラメーターオプティマイザー)を使用したハイパーパラメーター最適化から生じています。結果をファイルに保存することは不可欠です。なぜなら、スクリプトは切り離されたセッションなどでリモートで実行できるからです。

本質的に、私はしたい:

trial_search = RandomizedSearchCV( estimator=keras_model, ... )
pickle.dump( trial_search, open( "trial_search.pickle", "wb" ) )
11
Sida Zhou

現在、Kerasモデルはピクル可能です。ただし、model.save()を使用してモデルをディスクに保存することをお勧めします。

7
farizrahman4u

Get_weightsおよびset_weightsを使用して、モデルを保存およびロードします。

このリンクをご覧ください: 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()
4
Anurag Gupta

これは魅力のように機能します 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関数が永久に実行されました。

4
Sida Zhou

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
1
max89