我使用 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 的代码中。
谢谢你。
该模型有一个 save
方法,它保存了重构模型所需的所有细节。 keras documentation 中的示例:
from keras.models import load_model
model.save('my_model.h5') # creates a HDF5 file 'my_model.h5'
del model # deletes the existing model
# returns a compiled model
# identical to the previous one
model = load_model('my_model.h5')
您可以将模型保存为 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")
ValueError: Unknown initializer: GlorotUniform
。你能建议如何解决这个问题吗?
您可以使用 model.save(filepath)
将 Keras 模型保存到单个 HDF5 文件中,该文件将包含:
模型的架构,允许重新创建模型。
模型的权重。
训练配置(损失、优化器)
优化器的状态,允许在您停止的地方恢复训练。
在您的 Python 代码中,最后一行可能应该是:
model.save("m.hdf5")
这允许您将模型的全部状态保存在单个文件中。可以通过 keras.models.load_model()
重新实例化保存的模型。
load_model()
返回的模型是可以使用的已编译模型(除非保存的模型从一开始就从未编译过)。
model.save()
参数:
filepath:字符串,保存权重的文件的路径。
overwrite:是静默覆盖目标位置的任何现有文件,还是为用户提供手动提示。
include_optimizer:如果为 True,则将优化器的状态一起保存。
.h5
、.hdf5
或 .keras
的文件名或将 save_format='h5'
传递给 save()
来选择这种格式。较新的格式是 TensorFlow SavedModel 格式,它由一个文件夹中的多个文件和文件夹组成。如果“文件路径”不以具有上述三个给定扩展名之一的文件结尾,则将采用此方法。 (见keras documentation at tensorflow.org。)
您可以通过这种方式保存模型并加载。
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 模型的首选方式。
保存 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')
有关详细信息,请阅读 Documentation
您可以使用 keras.callbacks.ModelCheckpoint()
保存最佳模型
例子:
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 的语法,如何保存模型,多年来发生了变化,我将发布一个新的答案。原则上,bogatron 的最早答案,发布于 17 年 3 月 13 日 12:10 仍然很好,如果您想将包括权重的模型保存到一个文件中。
model.save("my_model.h5")
这将以较旧的 Keras H5 格式保存模型。
但是,有一种新格式,即 TensorFlow SavedModel 格式,如果您未在文件名后指定扩展名 .h5、.hdf5 或 .keras,将使用该格式。
这种情况下的语法是
model.save("path/to/folder")
如果给定的文件夹名称尚不存在,则会创建它。将在此文件夹中创建两个文件和两个文件夹:
keras_metadata.pb、saved_model.pb、资产、变量
到目前为止,您仍然可以决定是将模型存储到单个文件中还是存储到包含文件和文件夹的文件夹中。 (见keras documentation at www.tensorflow.org。)
不定期副业成功案例分享
KerasClassifier
的callbacks
关键字设置为一个列表,其单个项目是一个 keras ModelCheckpoint 的实例?ModelCheckpoint
回调用于在每个训练时期后保存模型(仅当验证错误减少时可选)。它可以保存多个文件或单个(覆盖)文件。ValueError: Cannot create group in read only mode.