2016-01-29 3 views
17

Как загрузить модель из файла HDF5 в Keras?Как загрузить модель из файла 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 

ответ

24

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

Смотрите следующий пример кода, как построить основную Keras Neural Net модель, сохранить модель (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)) 
23

Если вы сохранили полную модель, не только веса, в файле HDF5, то это так же просто, как

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

ли модель включает в себя фактические данные по обучению, а также при расчете объема памяти модели? Как вы можете загрузить модель, которая больше, чем ваша доступная память? – user798719

+0

Модель НЕ (явно) включает данные обучения. Вы не можете загрузить модель, которая больше вашей доступной памяти (ну, хорошо, это возможно, но это будет довольно сложно, и вам нужно будет пройти через это самостоятельно ... но если ваша модель слишком велика, чтобы загрузить вас должен (a) получить больше памяти или (b) обучить меньшую модель) –

+0

@MartinThoma Я использую предложенный вами метод. Я пытаюсь получить один слой из загруженной модели и пытаюсь увидеть его вес с помощью: 'кодировщика = autoencoder.layers [0] encoder.get_weights() ' Но я получаю: ' FailedPreconditionError: попытка использовать неинициализированное значение lstm_1/kernel' – shubhamsingh