Python 如何使用keras保存最终模型?

Python 如何使用keras保存最终模型?,python,machine-learning,keras,Python,Machine Learning,Keras,我使用KerasClassifier来训练分类器 代码如下: import numpy from pandas import read_csv from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasClassifier from keras.utils import np_utils from sklearn.model_sel

我使用KerasClassifier来训练分类器

代码如下:

import numpy
from pandas import read_csv
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from keras.utils import np_utils
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.preprocessing import LabelEncoder
from sklearn.pipeline import Pipeline
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load dataset
dataframe = read_csv("iris.csv", header=None)
dataset = dataframe.values
X = dataset[:,0:4].astype(float)
Y = dataset[:,4]
# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
#print("encoded_Y")
#print(encoded_Y)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_Y)
#print("dummy_y")
#print(dummy_y)
# define baseline model
def baseline_model():
    # create model
    model = Sequential()
    model.add(Dense(4, input_dim=4, init='normal', activation='relu'))
    #model.add(Dense(4, init='normal', activation='relu'))
    model.add(Dense(3, init='normal', activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

    return model

estimator = KerasClassifier(build_fn=baseline_model, nb_epoch=200, batch_size=5, verbose=0)
#global_model = baseline_model()
kfold = KFold(n_splits=10, shuffle=True, random_state=seed)
results = cross_val_score(estimator, X, dummy_y, cv=kfold)
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
但如何保存最终模型以供未来预测

我通常使用以下代码保存模型:

# serialize model to JSON
model_json = model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)
# serialize weights to HDF5
model.save_weights("model.h5")
print("Saved model to disk")
但我不知道如何将储蓄模型的代码插入KerasClassifier的代码中


谢谢。

模型有一个
保存
方法,可以保存重建模型所需的所有详细信息。下面是一个例子:


您可以将模型保存为json格式,并将权重保存为hdf5文件格式

# keras library import  for Saving and loading model and weights

from keras.models import model_from_json
from keras.models import load_model

# serialize model to JSON
#  the keras model which is trained is defined as 'model' in this example
model_json = model.to_json()


with open("model_num.json", "w") as json_file:
    json_file.write(model_json)

# serialize weights to HDF5
model.save_weights("model_num.h5")
创建了包含模型和权重的文件“model_num.h5”和“model_num.json”

要使用相同的训练模型进行进一步测试,只需加载hdf5文件并将其用于不同数据的预测。 下面介绍如何从保存的文件加载模型

# load json and create model
json_file = open('model_num.json', 'r')

loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)

# load weights into new model
loaded_model.load_weights("model_num.h5")
print("Loaded model from disk")

loaded_model.save('model_num.hdf5')
loaded_model=load_model('model_num.hdf5')
要预测不同的数据,可以使用

loaded_model.predict_classes("your_test_data here")

您可以使用
model.save(filepath)
将Keras模型保存到单个HDF5文件中,该文件将包含:

  • 模型的体系结构,允许重新创建模型
  • 模型的权重
  • 培训配置(丢失、优化器)
  • 优化器的状态,允许在您停止的位置恢复培训
在Python代码中,最后一行应该是:

model.save("m.hdf5")
这允许您将模型的整个状态保存在单个文件中。 保存的模型可以通过
keras.models.load\u model()
重新实例化

load\u model()
返回的模型是一个已编译的模型,可以随时使用(除非保存的模型从未编译过)

model.save()
参数:

  • filepath:String,保存权重的文件的路径
  • 覆盖:是以静默方式覆盖目标位置的任何现有文件,还是向用户提供手动提示
  • include_optimizer:如果为True,则一起保存优化器的状态

您可以通过这种方式保存模型和加载

from keras.models import Sequential, load_model
from keras_contrib.losses import import crf_loss
from keras_contrib.metrics import crf_viterbi_accuracy

# To save model
model.save('my_model_01.hdf5')

# To load the model
custom_objects={'CRF': CRF,'crf_loss':crf_loss,'crf_viterbi_accuracy':crf_viterbi_accuracy}

# To load a persisted model that uses the CRF layer 
model1 = load_model("/home/abc/my_model_01.hdf5", custom_objects = custom_objects)

通常,我们通过调用
save()
函数将模型和权重保存在同一个文件中

为了节约

model.compile(optimizer='adam',
              loss = 'categorical_crossentropy',
              metrics = ["accuracy"])

model.fit(X_train, Y_train,
         batch_size = 32,
         epochs= 10,
         verbose = 2, 
         validation_data=(X_test, Y_test))

#here I have use filename as "my_model", you can choose whatever you want to.

model.save("my_model.h5") #using h5 extension
print("model saved!!!")
加载模型时

from keras.models import load_model

model = load_model('my_model.h5')
model.summary()
在这种情况下,我们可以简单地保存和加载模型,而无需重新编译模型。
注意-这是保存和加载Keras模型的首选方法。

您可以使用

例如:

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model_checkpoint_callback = keras.callbacks.ModelCheckpoint("best_Model.h5",save_best_only=True)
history = model.fit(x_train,y_train,
          epochs=10,
          validation_data=(x_valid,y_valid),
          callbacks=[model_checkpoint_callback])

这将在您的工作目录中保存最佳模型。

保存Keras模型:

model = ...  # Get model (Sequential, Functional Model, or Model subclass)
model.save('path/to/location')
from tensorflow import keras
model = keras.models.load_model('path/to/location')
重新加载模型:

model = ...  # Get model (Sequential, Functional Model, or Model subclass)
model.save('path/to/location')
from tensorflow import keras
model = keras.models.load_model('path/to/location')

有关更多信息,请阅读

对不起,我是指cross_val_分数的最终权重。您是否尝试将
KerasClassifier
回调
关键字设置为一个列表,该列表的单个项目是keras的实例?不,我不知道ModelCheckpoint。你能详细解释一下吗?谢谢,请点击我评论中的链接了解详情。
ModelCheckpoint
回调用于在每个训练时段后保存模型(仅当验证错误减少时可选)。它可以保存多个文件或单个(覆盖的)文件。在代码行上方执行,但在加载_model()时执行它显示此错误:
ValueError:无法在只读模式下创建组。
我试图使用您的代码,但它保存了模型,但在加载时出现此错误:
ValueError:未知初始值设定项:GlorotUniform
。你能建议如何解决这个问题吗?看看这个[谢谢你的回复,嗯。但是我找到了解决办法,我在下面的答案中解释了它。