Python 如何从Keras中的HDF5文件加载模型?

Python 如何从Keras中的HDF5文件加载模型?,python,machine-learning,keras,data-science,Python,Machine Learning,Keras,Data Science,如何从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(D

如何从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
索引器错误回溯(最近一次调用)
在()
1 model2=顺序()
---->2模型2.加载权重(“/Users/Desktop/SquareSpace/weights.hdf5”)
/加载权重中的Applications/anaconda/lib/python2.7/site-packages/keras/models.pyc(self,filepath)
582 g=f['layer_{}'。格式(k)]
583权重=[g['param{}'。格式(p)],用于范围内的p(g.attrs['nb_params'])]
-->584 self.layers[k]。设置权重(权重)
585 f.关闭()
586
索引器:列表索引超出范围

加载权重
仅设置网络的权重。在调用
load\u 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)

关于如何构建基本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))

如果您在HDF5文件中存储了完整的模型,而不仅仅是权重,那么它就像

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

根据官方文件

你可以做:

如果已通过运行

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,我可以这样做

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)

在计算模型的内存占用时,模型是否也包含实际的训练数据?如何加载一个比可用内存大的模型?模型不(明确地)包含训练数据。你不能加载一个比可用内存大的模型(好吧,这是可能的,但这将是相当困难的,你需要自己来完成…但是如果你的模型太大而无法加载,你应该(a)获得更多内存或(b)训练一个更小的模型)@Martintoma我正在使用你建议的方法。我试图从加载的模型中获取一个层,并试图通过以下方式查看它的权重:
encoder=autoencoder.layers[0]encoder.get_weights()
但是我得到了:
失败的预处理错误:尝试使用未初始化的值lstm_1/kernel
我很感激你的赞美:-)来强调公认的答案:我可以想象只存储权重更可靠。如果keras发生变化,则仍然可以导入权重,而无法导入完整的对象。另一方面,你可以安装一个旧版本,卸下重物,然后做同样的事情。@ PR338请考虑更新你接受的答案。这对于我从JSON和H5加载模型起了作用。如果使用@InheritedGeek的示例,请确保记住model.compile()。在调用model.evaluate之前,需要使用该选项。很好的例子,谢谢!如果你想加载整个模型,而不仅仅是重量:
从keras.models导入load_model
然后
model=load_model('model.h5')
@mikael,你能给我一个关于这篇文章的提示吗?没有model.save()。只有model.model.save()。加载此模型并以原始创建的模型方式使用会导致错误。加载的对象是我在下面的站点解决了我的问题[我得到了一个404link@TRINADHNAGUBADI,请更新链接,页面已不存在。这在Keras 2.2.4和h5py 2.9.0中似乎不起作用。我收到以下错误:Anaconda3\envs\synthetic\lib\site packages\Keras\utils\io_utils.py,第302行,在getitem raise ValueError中('无法在只读模式下创建组')