Keras'ta bir HDF5 dosyasından bir model nasıl yüklenir?


94

Keras'ta bir HDF5 dosyasından bir model nasıl yüklenir?

Ne denedim:

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

Yukarıdaki kod, en iyi modeli başarıyla weights.hdf5 adlı bir dosyaya kaydeder. Yapmak istediğim şey o modeli yüklemek. Aşağıdaki kod, bunu nasıl yapmaya çalıştığımı gösterir:

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

Aldığım hata bu:

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

Yanıtlar:


84

load_weightsyalnızca ağınızın ağırlıklarını ayarlar. Hala aramadan önce mimarisini tanımlamanız gerekiyor 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
Sadece ağırlıkları değil, TAM modeli yüklemek istiyorsanız: from keras.models import load_modelo zamanmodel = load_model('model.h5')
cgnorthcutt

1
@mikael, bu SO gönderisiyle bana bir ipucu verebilir misin? stackoverflow.com/questions/55050339/…
HenryHub

207

Sadece ağırlıkları değil, tüm modeli HDF5 dosyasında sakladıysanız, o kadar basittir:

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

Bir model, modelin bellek ayak izini hesaplarken gerçek eğitim verilerini de içeriyor mu? Kullanılabilir belleğinizden daha büyük bir modeli nasıl yükleyebilirsiniz?
user798719

Bir model (açıkça) eğitim verilerini İÇERMEZ. Mevcut hafızanızdan daha büyük bir modeli yükleyemezsiniz (peki, tamam, bu mümkün ama bu oldukça zor olacak ve bunu kendiniz yapmanız gerekecek ... ancak modeliniz sizi yükleyemeyecek kadar büyükse (a) daha fazla bellek almalı veya (b) daha küçük bir modeli eğitmeli)
Martin Thoma

@MartinThoma Sizin tarafınızdan önerilen yöntemi kullanıyorum. Yüklenen modelden bir katman çıkarmaya çalışıyorum ve ağırlıklarını şu şekilde görmeye çalışıyorum: encoder = autoencoder.layers[0] encoder.get_weights() Ama şunu alıyorum: FailedPreconditionError: Attempting to use uninitialized value lstm_1/kernel
shubhamsingh

1
İltifatı takdir ediyorum :-) Kabul edilen cevap için bir noktaya değinmek gerekirse: Sadece ağırlıkları saklamanın daha sağlam olduğunu hayal edebiliyordum. Keras değişirse, ağırlıklar yine de içe aktarılabilirken tüm şey içe aktarılamaz. Öte yandan, eski bir sürümü yükleyebilir, ağırlıkları atabilir ve öncekinin aynısını yapabilir.
Martin Thoma

@ pr338 Lütfen kabul ettiğiniz cevabı güncellemeyi düşünün.
Kris

28

Temel bir Keras Sinir Ağı Modeli Oluşturma, Modeli (JSON) ve Ağırlıkları (HDF5) kaydetme ve yükleme hakkında aşağıdaki örnek koda bakın:

# 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
Bu, json ve h5'ten bir model yüklerken benim için çalıştı. @ InheritedGeek örneğini kullanırsanız, model.compile () dosyasını hatırladığınızdan emin olun. Model.evaluate'ı çağırmadan önce gereklidir. Harika örnek, Teşekkürler!
CodeGuyRoss

6

Resmi belgelere göre https://keras.io/getting-started/faq/#how-can-i-install-hdf5-or-h5py-to-save-my-models-in-keras

yapabilirsin :

h5py'nin kurulu olup olmadığını ilk önce

import h5py

h5py'yi içe aktarırken herhangi bir hata yapmazsanız, kaydetmeniz iyi olur:

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 yüklemeniz gerekiyorsa


3
Bu, h5py 2.9.0 ile Keras 2.2.4'te çalışmıyor gibi görünüyor. Şu hatayı alıyorum: Anaconda3 \ envs \ sentetik \ lib \ site-packages \ keras \ utils \ io_utils.py ", satır 302, getitem yükseltmesinde ValueError ('Salt okunur kipte grup oluşturulamaz.')
csteel

0

Bu şekilde yaptım

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 () yok. Yalnızca model.model.save () vardır. Bu modeli geri yüklemek ve orijinal oluşturulan modelde kullanmak hatalara yol açar. Yüklenen nesne <keras.engine.sequential.Sequential iken oluşturduğumuz şey keras.wrappers.scikit_learn.KerasRegressor. Nasıl değiştirebilirim?
kum


Bu bağlantıda 404 var
kum


@TRINADH NAGUBADI, Bağlantıyı güncelleyin lütfen, sayfa artık mevcut değil.
Catalina Chircu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.