Як завантажити модель із файлу 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

Відповіді:


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, ти можеш дати мені підказку з цим SO повідомленням? stackoverflow.com/questions/55050339 / ...
HenryHub

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 Будь ласка, подумайте про оновлення прийнятої відповіді.
Kris

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 \ синтетичний \ lib \ site-пакети \ 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)

немає моделі.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, оновіть посилання, будь ласка, сторінки більше не існує.
Каталіна Чірку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.