Bagaimana cara memuat model dari file HDF5 di Keras?

94

Bagaimana cara memuat model dari file HDF5 di Keras?

Apa yang saya coba:

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

Kode di atas berhasil menyimpan model terbaik ke file bernama weights.hdf5. Yang ingin saya lakukan adalah memuat model itu. Kode di bawah ini menunjukkan bagaimana saya mencoba melakukannya:

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

Ini adalah kesalahan yang saya dapatkan:

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
sumber

Jawaban:

84

load_weightshanya menyetel bobot jaringan Anda. Anda masih perlu menentukan arsitekturnya sebelum memanggil 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)
Mikael Rousson
sumber
37
Jika Anda ingin memuat model LENGKAP, bukan hanya bobotnya: from keras.models import load_modelmakamodel = load_model('model.h5')
cgnorthcutt
1
@mikael, dapatkah Anda memberi saya tip dengan posting SO ini? stackoverflow.com/questions/55050339/…
HenryHub
207

Jika Anda menyimpan model lengkap, tidak hanya bobotnya, dalam file HDF5, maka sesederhana itu

from keras.models import load_model
model = load_model('model.h5')
Martin Thoma
sumber
apakah model menyertakan data pelatihan aktual saat menghitung footprint memori model? Bagaimana Anda bisa memuat model yang lebih besar dari memori yang tersedia?
user798719
Model TIDAK (secara eksplisit) menyertakan data pelatihan. Anda tidak dapat memuat model yang lebih besar dari memori yang tersedia (baik, ok, itu mungkin tetapi ini akan cukup sulit dan Anda harus melakukannya sendiri ... tetapi jika model Anda terlalu besar untuk memuat Anda harus (a) mendapatkan lebih banyak memori atau (b) melatih model yang lebih kecil)
Martin Thoma
@MartinThoma Saya menggunakan metode yang disarankan oleh Anda. Saya mencoba untuk mendapatkan satu lapisan dari model yang dimuat dan mencoba untuk melihat bobotnya dengan: encoder = autoencoder.layers[0] encoder.get_weights() Tapi saya mendapatkan: FailedPreconditionError: Attempting to use uninitialized value lstm_1/kernel
shubhamsingh
1
Saya menghargai pujiannya :-) Untuk menjelaskan jawaban yang diterima: Saya bisa membayangkan bahwa menyimpan hanya beban lebih kuat. Jika keras berubah, bobot masih bisa diimpor sementara yang lengkap tidak bisa diimpor. Di sisi lain, seseorang dapat menginstal versi lama, membuang bobot dan melakukan hal yang sama seperti sebelumnya.
Martin Thoma
@ pr338 Harap pertimbangkan untuk memperbarui jawaban yang Anda terima.
Kris
28

Lihat kode contoh berikut tentang cara membuat Model Jaringan Keras Neural dasar, menyimpan Model (JSON) & Bobot (HDF5) dan memuatnya:

# 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))
Ahli Warisan
sumber
1
Ini berfungsi untuk saya saat memuat model dari json dan h5. Pastikan jika Anda menggunakan contoh @ InheritedGeek Anda ingat model.compile (). Ini diperlukan sebelum Anda dapat memanggil model.evaluate. Contoh yang bagus, Terima kasih!
CodeGuyRoss
6

Menurut dokumentasi resmi https://keras.io/getting-started/faq/#how-can-i-install-hdf5-or-h5py-to-save-my-models-in-keras

Anda dapat melakukan :

tes pertama jika Anda memiliki h5py diinstal dengan menjalankan

import h5py

jika Anda tidak mengalami kesalahan saat mengimpor h5py, Anda sebaiknya menyimpannya:

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

Jika Anda perlu menginstal h5py http://docs.h5py.org/en/latest/build.html

Richardd
sumber
3
Ini sepertinya tidak bekerja di Keras 2.2.4 dengan h5py 2.9.0. Saya mendapatkan kesalahan berikut: Anaconda3 \ envs \ synthetic \ lib \ site-packages \ keras \ utils \ io_utils.py ", baris 302, di getitem meningkatkan ValueError ('Tidak dapat membuat grup dalam mode hanya baca.')
csteel
0

Saya melakukannya dengan cara ini

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)
TRINADH NAGUBADI
sumber
tidak ada model.save (). Hanya ada model.model.save (). Dan memuat kembali model ini dan menggunakannya dengan cara model asli yang dibuat akan menyebabkan kesalahan. Objek yang dimuat adalah <keras.engine.sequential.Sequential Sedangkan yang kita buat adalah keras.wrappers.scikit_learn.KerasRegressor. Bagaimana saya bisa mengubahnya?
pasir
Saya memecahkan masalah saya di situs di bawah ini [ github.com/keras-team/keras-contrib/blob/master/keras_contrib/…
TRINADH NAGUBADI
Saya mendapat 404 di tautan itu
pasir
@TRINADH NAGUBADI, Harap perbarui linknya, halaman sudah tidak ada.
Catalina Chircu