Как загрузить модель из файла HDF5 в Keras?

94

Как загрузить модель из файла HDF5 в Keras?

Что пробовал:

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

Приведенный выше код успешно сохраняет лучшую модель в файл с именем weights.hdf5. Что я хочу сделать, так это загрузить эту модель. В приведенном ниже коде показано, как я пытался это сделать:

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

Это ошибка, которую я получаю:

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
pr338
источник

Ответы:

84

load_weightsустанавливает только веса вашей сети. Вам все еще нужно определить его архитектуру перед вызовом 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)
Микаэль Руссон
источник
37
Если вы хотите загрузить ПОЛНУЮ модель, а не только веса: from keras.models import load_modelтогдаmodel = load_model('model.h5')
cgnorthcutt
1
@mikael, можешь дать мне совет в этом ТАК сообщении? stackoverflow.com/questions/55050339/…
HenryHub 07
207

Если вы сохранили полную модель, а не только веса, в файле HDF5, это так же просто, как

from keras.models import load_model
model = load_model('model.h5')
Мартин Тома
источник
включает ли модель фактические данные обучения при расчете объема памяти модели? Как вы могли загрузить модель, размер которой превышает доступную вам память?
user798719
Модель НЕ включает (явно) обучающие данные. Вы не можете загрузить модель, размер которой больше, чем ваша доступная память (ну, хорошо, это возможно, но это будет довольно сложно, и вам нужно будет пройти через это самостоятельно ... но если ваша модель слишком велика, чтобы загрузить вас должен (а) получить больше памяти или (б) обучить модель меньшего размера)
Мартин Тома,
@MartinThoma Я использую предложенный вами метод. Я пытаюсь получить один слой из загруженной модели и пытаюсь увидеть его вес по: encoder = autoencoder.layers[0] encoder.get_weights() Но я получаю: FailedPreconditionError: Attempting to use uninitialized value lstm_1/kernel
shubhamsingh
1
Я ценю комплимент :-) Чтобы указать на принятый ответ: я могу представить, что хранение только весов более надежно. Если keras изменится, веса все равно можно будет импортировать, в то время как весь объект не может быть импортирован. С другой стороны, можно установить старую версию, сбросить веса и сделать то же самое, что и раньше.
Мартин Тома
@ pr338 Пожалуйста, подумайте об обновлении принятого ответа.
Крис
28

См. Следующий пример кода о том, как построить базовую модель нейронной сети Keras, сохранить модель (JSON) и веса (HDF5) и загрузить их:

# 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))
Унаследованный компьютерщик
источник
1
Это сработало для меня при загрузке модели из json и h5. Убедитесь, что если вы используете пример @ InheritedGeek, вы помните model.compile (). Это необходимо, прежде чем вы сможете вызвать model.evaluate. Отличный пример, спасибо!
CodeGuyRoss
6

Согласно официальной документации https://keras.io/getting-started/faq/#how-can-i-install-hdf5-or-h5py-to-save-my-models-in-keras

ты можешь сделать :

сначала проверьте, установлен ли у вас h5py, запустив

import h5py

если у вас нет ошибок при импорте h5py, вы можете сэкономить:

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

Если вам нужно установить h5py http://docs.h5py.org/en/latest/build.html

Ричард
источник
3
Это не работает в Keras 2.2.4 с h5py 2.9.0. Я получаю следующую ошибку: Anaconda3 \ envs \ Synt \ lib \ site-packages \ keras \ utils \ io_utils.py ", строка 302, в getitem raise ValueError ('Невозможно создать группу в режиме только для чтения.')
csteel
0

Я сделал таким образом

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)
ТРИНАД НАГУБАДИ
источник
нет model.save (). Есть только model.model.save (). И загрузка этой модели обратно и использование ее в исходной созданной модели приводит к ошибкам. Загруженный объект - это <keras.engine.sequential.Sequential, а тот, который мы создаем, - это keras.wrappers.scikit_learn.KerasRegressor. Как я могу это изменить?
песок
Я решил свою проблему на сайте ниже [ github.com/keras-team/keras-contrib/blob/master/keras_contrib/…
TRINADH NAGUBADI
Я получил 404 по этой ссылке
песок
@TRINADH NAGUBADI, обновите ссылку пожалуйста, страница больше не существует.
Каталина Чирку,