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)