Keras의 HDF5 파일에서 모델을로드하는 방법은 무엇입니까?


94

Keras의 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
: 당신은 FULL 모델뿐 아니라 무게를로드하려면 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) 작은 모델을 학습) 가야
마틴 토마스

@MartinThoma 나는 당신이 제안한 방법을 사용하고 있습니다. 나는로드 된 모델 중 하나 개의 층을 얻으려고 노력하고 의해 가중치를의 보려고 해요 : encoder = autoencoder.layers[0] encoder.get_weights() 하지만 난 받고 있어요 : FailedPreconditionError: Attempting to use uninitialized value lstm_1/kernel
shubhamsingh

1
칭찬에 감사드립니다 :-) 받아 들여지는 대답에 대한 요점을 만들기 위해 : 가중치 만 저장하는 것이 더 강력하다고 상상할 수 있습니다. keras가 변경되면 전체 항목을 가져올 수없는 동안 가중치를 계속 가져올 수 있습니다. 반면에 이전 버전을 설치하고 가중치를 덤프하고 이전과 동일하게 수행 할 수 있습니다.
Martin Thoma

@ pr338 수락 된 답변을 업데이트하는 것을 고려하십시오.
크리스

28

기본 Keras 신경망 모델을 빌드하고 모델 (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 ()을 기억해야합니다. model.evaluate를 호출하기 전에 필요합니다. 좋은 예, 감사합니다!
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
이것은 h5py 2.9.0과 함께 Keras 2.2.4에서 작동하지 않는 것 같습니다. 다음 오류가 발생합니다. Anaconda3 \ envs \ synthetic \ lib \ site-packages \ keras \ utils \ io_utils.py ", 302 행, getitem raise ValueError ( 'Cannot create group in read only mode.')
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.