Làm cách nào để tải một mô hình từ tệp HDF5 trong Keras?


94

Làm cách nào để tải một mô hình từ tệp HDF5 trong Keras?

Những gì tôi đã thử:

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

Đoạn mã trên lưu thành công mô hình tốt nhất vào tệp có tên weights.hdf5. Những gì tôi muốn làm là tải mô hình đó. Đoạn mã dưới đây cho thấy cách tôi đã cố gắng làm như vậy:

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

Đây là lỗi tôi nhận được:

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

Câu trả lời:


84

load_weightschỉ đặt trọng số của mạng của bạn. Bạn vẫn cần xác định kiến ​​trúc của nó trước khi gọi 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
Nếu bạn muốn tải mô hình ĐẦY ĐỦ, không chỉ các trọng số: from keras.models import load_modelthìmodel = load_model('model.h5')
cgnorthcutt

1
@mikael, bạn có thể cho tôi một mẹo với bài SO này không? stackoverflow.com/questions/55050339/…
HenryHub Ngày

207

Nếu bạn đã lưu trữ mô hình hoàn chỉnh, không chỉ trọng số, trong tệp HDF5, thì nó đơn giản như

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

một mô hình có bao gồm dữ liệu huấn luyện thực tế cũng như khi tính toán vùng nhớ của mô hình không? Làm thế nào bạn có thể tải một mô hình lớn hơn bộ nhớ khả dụng của bạn?
user798719,

Một mô hình KHÔNG (rõ ràng) bao gồm dữ liệu đào tạo. Bạn không thể tải một mô hình lớn hơn bộ nhớ khả dụng của bạn (tốt, được, có thể nhưng điều này sẽ khá khó khăn và bạn sẽ cần phải tự mình vượt qua ... nhưng nếu mô hình của bạn quá lớn để tải bạn nên (a) có thêm bộ nhớ hoặc (b) đào tạo một mô hình nhỏ hơn)
Martin Thoma

@MartinThoma Tôi đang sử dụng phương pháp do bạn đề xuất. Tôi đang cố gắng để có được một lớp ra của mô hình được tải và cố gắng để nhìn thấy nó là trọng lượng bởi: encoder = autoencoder.layers[0] encoder.get_weights() Nhưng tôi nhận được: FailedPreconditionError: Attempting to use uninitialized value lstm_1/kernel
shubhamsingh

1
Tôi đánh giá cao lời khen :-) Để tạo điểm nhấn cho câu trả lời được chấp nhận: Tôi có thể tưởng tượng rằng chỉ lưu trữ các quả nặng thì chắc chắn hơn. Nếu keras thay đổi, trọng lượng vẫn có thể được nhập trong khi không thể nhập toàn bộ. Mặt khác, người ta có thể cài đặt một phiên bản cũ, đổ các trọng lượng và thực hiện tương tự như trước.
Martin Thoma

@ pr338 Vui lòng xem xét cập nhật câu trả lời được chấp nhận của bạn.
Kris

28

Xem mã mẫu sau đây về cách Xây dựng Mô hình mạng thần kinh Keras cơ bản, lưu Mô hình (JSON) & Trọng lượng (HDF5) và tải chúng:

# 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
Điều này đã làm việc cho tôi khi tải một mô hình từ json và h5. Đảm bảo rằng nếu bạn sử dụng ví dụ của @ InheritedGeek, bạn nhớ model.compile (). Nó là bắt buộc trước khi bạn có thể gọi model.evaluate. Ví dụ tuyệt vời, Cảm ơn!
CodeGuyRoss

6

Theo tài liệu chính thức https://keras.io/getting-started/faq/#how-can-i-install-hdf5-or-h5py-to-save-my-models-in-keras

bạn có thể làm :

kiểm tra đầu tiên nếu bạn đã cài đặt h5py bằng cách chạy

import h5py

nếu bạn không gặp lỗi khi nhập h5py, bạn nên lưu:

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

Nếu bạn cần cài đặt h5py http://docs.h5py.org/en/latest/build.html


3
Điều này dường như không hoạt động trong Keras 2.2.4 với h5py 2.9.0. Tôi gặp lỗi sau: Anaconda3 \ envs \ tổng hợp \ lib \ site-package \ keras \ utils \ io_utils.py ", dòng 302, trong mục nâng cao ValueError ('Không thể tạo nhóm ở chế độ chỉ đọc.')
csteel

0

Tôi đã làm theo cách này

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)

không có model.save (). Chỉ có model.model.save (). Và việc tải lại mô hình này và sử dụng nó theo cách mô hình đã tạo ban đầu dẫn đến lỗi. Đối tượng được tải là <keras.engine.sequential.Sequential Trong khi đối tượng chúng ta tạo là keras.wrappers.scikit_learn.KerasRegressor. Tôi có thể thay đổi nó bằng cách nào?
sand

Tôi đã giải quyết vấn đề của mình trên trang web bên dưới [ github.com/keras-team/keras-contrib/blob/master/keras_contrib/…
TRINADH NAGUBADI

Tôi có một 404 trên trang liên kết
cát


@TRINADH NAGUBADI, Vui lòng cập nhật liên kết, trang này không còn tồn tại.
Catalina Chircu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.