Uso KerasClassifier para entrenar el clasificador.
El código está abajo:
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 (ie 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))Pero, ¿cómo guardar el modelo final para futuras predicciones?
Usualmente uso el siguiente código para guardar el modelo:
# 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")Pero no sé cómo insertar el código del modelo de guardado en el código de KerasClassifier.
Gracias.
El modelo tiene un método de save , que guarda todos los detalles necesarios para reconstituir el modelo. Un ejemplo de la documentación de Keras :
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')puede guardar el modelo en json y los pesos en un formato de archivo 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")Se crean los archivos "model_num.h5" y "model_num.json" que contienen nuestro modelo y pesos
Para usar el mismo modelo entrenado para realizar más pruebas, simplemente puede cargar el archivo hdf5 y usarlo para la predicción de diferentes datos. aquí se explica cómo cargar el modelo desde archivos guardados.
# 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')Para predecir para diferentes datos, puede usar esto
loaded_model.predict_classes("your_test_data here")Puede usar model.save(filepath) para guardar un modelo de Keras en un solo archivo HDF5 que contendrá:
En su código Python, probablemente la última línea debería ser:
model.save("m.hdf5") Esto le permite guardar la totalidad del estado de un modelo en un solo archivo. Los modelos guardados se pueden volver a crear a través keras.models.load_model() .
El modelo devuelto por load_model() es un modelo compilado listo para usarse (a menos que el modelo guardado nunca haya sido compilado en primer lugar).
argumentos model.save() :