tutorial learning español python machine-learning keras data-science

python - learning - ¿Cómo cargar un modelo desde un archivo HDF5 en Keras?



keras python documentation (5)

Consulte el siguiente código de muestra sobre cómo construir un modelo básico de red neuronal Keras, guardar el modelo (JSON) y los pesos (HDF5) y cargarlos:

# create model model = Sequential() model.add(Dense(X.shape[1], input_dim=X.shape[1], activation=''relu'')) #Input Layer model.add(Dense(X.shape[1], activation=''relu'')) #Hidden Layer model.add(Dense(output_dim, activation=''softmax'')) #Output Layer # Compile & Fit model model.compile(loss=''binary_crossentropy'', optimizer=''adam'', metrics=[''accuracy'']) model.fit(X,Y,nb_epoch=5,batch_size=100,verbose=1) # serialize model to JSON model_json = model.to_json() with open("Data/model.json", "w") as json_file: json_file.write(simplejson.dumps(simplejson.loads(model_json), indent=4)) # serialize weights to HDF5 model.save_weights("Data/model.h5") print("Saved model to disk") # load json and create model json_file = open(''Data/model.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("Data/model.h5") print("Loaded model from disk") # evaluate loaded model on test data # Define X_test & Y_test data first loaded_model.compile(loss=''binary_crossentropy'', optimizer=''adam'', metrics=[''accuracy'']) score = loaded_model.evaluate(X_test, Y_test, verbose=0) print ("%s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100))

¿Cómo cargar un modelo desde un archivo HDF5 en Keras?

Lo que probé:

model = Sequential() model.add(Dense(64, input_dim=14, init=''uniform'')) model.add(LeakyReLU(alpha=0.3)) model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None)) model.add(Dropout(0.5)) model.add(Dense(64, init=''uniform'')) model.add(LeakyReLU(alpha=0.3)) model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None)) model.add(Dropout(0.5)) model.add(Dense(2, init=''uniform'')) model.add(Activation(''softmax'')) sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss=''binary_crossentropy'', optimizer=sgd) checkpointer = ModelCheckpoint(filepath="/weights.hdf5", verbose=1, save_best_only=True) model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2, callbacks=[checkpointer])

El código anterior guarda con éxito el mejor modelo en un archivo llamado weights.hdf5. Lo que quiero hacer es cargar ese modelo. El siguiente código muestra cómo intenté hacerlo:

model2 = Sequential() model2.load_weights("/Users/Desktop/SquareSpace/weights.hdf5")

Este es el error que obtengo:

IndexError Traceback (most recent call last) <ipython-input-101-ec968f9e95c5> in <module>() 1 model2 = Sequential() ----> 2 model2.load_weights("/Users/Desktop/SquareSpace/weights.hdf5") /Applications/anaconda/lib/python2.7/site-packages/keras/models.pyc in load_weights(self, filepath) 582 g = f[''layer_{}''.format(k)] 583 weights = [g[''param_{}''.format(p)] for p in range(g.attrs[''nb_params''])] --> 584 self.layers[k].set_weights(weights) 585 f.close() 586 IndexError: list index out of range


De acuerdo con la documentación oficial https://keras.io/getting-started/faq/#how-can-i-install-hdf5-or-h5py-to-save-my-models-in-keras

tu puedes hacer :

primera prueba si tiene instalado h5py ejecutando el

importar h5py

si no tiene errores al importar h5py, puede guardarlos:

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'')

Si necesita instalar h5py http://docs.h5py.org/en/latest/build.html


Lo hice de esta manera

from keras.models import Sequential 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)


Si almacenó el modelo completo, no solo los pesos, en el archivo HDF5, entonces es tan simple como

from keras.models import load_model model = load_model(''model.h5'')


load_weights solo establece los pesos de su red. Aún necesita definir su arquitectura antes de llamar a load_weights :

def create_model(): model = Sequential() model.add(Dense(64, input_dim=14, init=''uniform'')) model.add(LeakyReLU(alpha=0.3)) model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None)) model.add(Dropout(0.5)) model.add(Dense(64, init=''uniform'')) model.add(LeakyReLU(alpha=0.3)) model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None)) model.add(Dropout(0.5)) model.add(Dense(2, init=''uniform'')) model.add(Activation(''softmax'')) return model def train(): model = create_model() sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss=''binary_crossentropy'', optimizer=sgd) checkpointer = ModelCheckpoint(filepath="/tmp/weights.hdf5", verbose=1, save_best_only=True) model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose=2, callbacks=[checkpointer]) def load_trained_model(weights_path): model = create_model() model.load_weights(weights_path)