จะโหลดโมเดลจากไฟล์ 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 คุณช่วยให้คำแนะนำกับโพสต์นี้ได้ไหม stackoverflow.com/questions/55050339/…
HenryHub

207

หากคุณจัดเก็บโมเดลที่สมบูรณ์ไม่เพียง แต่น้ำหนักในไฟล์ HDF5 มันก็ทำได้ง่ายเหมือนไฟล์

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

แบบจำลองมีข้อมูลการฝึกอบรมจริงหรือไม่เมื่อคำนวณขนาดหน่วยความจำของโมเดล คุณจะโหลดโมเดลที่ใหญ่กว่าหน่วยความจำที่มีอยู่ได้อย่างไร?
user798719

แบบจำลองไม่ (อย่างชัดเจน) รวมข้อมูลการฝึกอบรม คุณไม่สามารถโหลดโมเดลที่ใหญ่กว่าหน่วยความจำที่คุณมีได้ (โอเคเป็นไปได้ แต่มันจะค่อนข้างยากและคุณจะต้องทำมันด้วยตัวเอง ... แต่ถ้าโมเดลของคุณใหญ่เกินไปที่จะโหลดคุณ ควร (a) ได้รับหน่วยความจำเพิ่มขึ้นหรือ (b) ฝึกโมเดลที่เล็กกว่า)
Martin Thoma

@MartinThoma ฉันใช้วิธีที่คุณแนะนำ ฉันกำลังพยายามเอาเลเยอร์หนึ่งออกจากโมเดลที่โหลดและพยายามดูว่ามันมีน้ำหนักโดย: encoder = autoencoder.layers[0] encoder.get_weights() แต่ฉันได้รับ: FailedPreconditionError: Attempting to use uninitialized value lstm_1/kernel
shubhamsingh

1
ฉันขอขอบคุณสำหรับคำชม :-) เพื่อชี้ให้เห็นคำตอบที่เป็นที่ยอมรับ: ฉันสามารถจินตนาการได้ว่าการจัดเก็บเฉพาะน้ำหนักนั้นมีประสิทธิภาพมากกว่า หาก Keras เปลี่ยนแปลงน้ำหนักจะยังคงนำเข้าได้ในขณะที่ไม่สามารถนำเข้าสิ่งที่สมบูรณ์ได้ ในทางกลับกันเราสามารถติดตั้งเวอร์ชันเก่าทิ้งน้ำหนักและทำเช่นเดียวกับก่อนหน้านี้
Martin Thoma

@ pr338 โปรดพิจารณาอัปเดตคำตอบที่คุณยอมรับ
Kris

28

ดูโค้ดตัวอย่างต่อไปนี้เกี่ยวกับวิธีสร้าง Keras Neural Net Model พื้นฐานบันทึก Model (JSON) & Weights (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 ได้การประเมิน เป็นตัวอย่างที่ดีขอบคุณ!
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 \ synthetic \ lib \ site-Packages \ 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.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 โปรดอัปเดตลิงก์หน้านี้ไม่มีอยู่แล้ว
Catalina Chircu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.