कैरस में HDF5 फ़ाइल से मॉडल कैसे लोड करें?


94

कैरस में HDF5 फ़ाइल से मॉडल कैसे लोड करें?

मैंने क्या कोशिश की:

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
@ मिकेल, क्या आप मुझे इस एसओ पद के साथ टिप दे सकते हैं? stackoverflow.com/questions/55050339/…
हेनरीहब

210

यदि आपने HDF5 फ़ाइल में न केवल वज़न, बल्कि पूरा मॉडल संग्रहीत किया है, तो यह उतना ही सरल है

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

मॉडल की मेमोरी पदचिह्न की गणना करते समय एक मॉडल में वास्तविक प्रशिक्षण डेटा शामिल होता है? आप उस मॉडल को कैसे लोड कर सकते हैं जो आपकी उपलब्ध मेमोरी से बड़ा है?
user798719

मॉडल में स्पष्ट रूप से प्रशिक्षण डेटा शामिल नहीं है। आप उस मॉडल को लोड नहीं कर सकते हैं जो आपकी उपलब्ध मेमोरी से अधिक है (ठीक है, ठीक है, यह संभव है लेकिन यह काफी कठिन होगा और आपको स्वयं उस पर से गुजरना होगा ... लेकिन यदि आपका मॉडल आपको लोड करने के लिए बहुत बड़ा है (a) को अधिक मेमोरी मिलनी चाहिए या (b) एक छोटे मॉडल को प्रशिक्षित करना चाहिए
मार्टिन थोमा

@MartinThoma मैं आपके द्वारा सुझाई गई विधि का उपयोग कर रहा हूं। मैं लोड किए गए मॉडल से एक परत निकालने की कोशिश कर रहा हूं और यह देखने की कोशिश कर encoder = autoencoder.layers[0] encoder.get_weights() रहा हूं कि यह वजन है: लेकिन मुझे मिल रहा है:FailedPreconditionError: Attempting to use uninitialized value lstm_1/kernel
शुभम्सिंह

1
मैं प्रशंसा की सराहना करता हूं :-) स्वीकार किए गए उत्तर के लिए एक बिंदु बनाने के लिए: मैं सोच सकता था कि केवल भार को अधिक मजबूत करना है। यदि केरेस बदलते हैं, तो वज़न अभी भी आयात किया जा सकता है जबकि पूरी चीज़ आयात नहीं की जा सकती। दूसरी ओर, एक पुराने संस्करण को स्थापित कर सकता है, वज़न घटा सकता है और पहले जैसा कर सकता है।
मार्टिन थोमा

@ pr338 कृपया अपने स्वीकृत उत्तर को अपडेट करने पर विचार करें।
क्रिस

28

बुनियादी केरस न्यूरल नेट मॉडल बनाने के तरीके, मॉडल (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 () को याद रखें। इससे पहले कि आप मॉडल कॉल करें। मूल्यांकन आवश्यक है। महान उदाहरण, धन्यवाद!
कोडगुयार

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
यह H5py 2.9.0 के साथ Keras 2.2.4 में काम नहीं करता है। मुझे निम्न त्रुटि मिलती है: Anaconda3 \ envs \ सिंथेटिक \ lib \ साइट-संकुल \ keras \ utils \ io_utils.py ", पंक्ति 302, getitem में 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.model.save () है। और इस मॉडल को वापस लोड करने और मूल निर्मित मॉडल तरीके से इसका उपयोग करने से त्रुटियां होती हैं। लोड की गई वस्तु <keras.engine.fterential.Sequential है जबकि हम जो बनाते हैं वह keras.wrappers.scikit_learn.KerasRegressor है। मैं इसे बदलने में किस तरह सक्षम हूं?
बालू

मैंने अपनी समस्या नीचे दी गई साइट [ github.com/keras-team/keras-contrib/blob/master/keras_contrib/…
TRINADH NAGUBADI

मुझे उस लिंक पर एक 404 मिला
रेत


@TRINADH NAGUBADI, कृपया लिंक अपडेट करें, पेज अब मौजूद नहीं है।
कैटालिना चिरकु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.