我遇到的问题是,当我加载序列化的Keras LSTM模型(在单独的机器上,尽管除了GPU之外,配置相同,但配置相同)时,它可以很好地加载,但在使用model.predict()
方法时会冻结。
训练模型后(当它仍在内存中时),我使用完全相同的推理方法,并且没有问题。
我这样加载模型:
def load_ner_model(self):
mod_name_ext = '{}.h5'.format(self.mod_name)
mod_path = 'misc/3p_ner/'
tt_name = '{}_text_tokenizer.pickle'.format(self.mod_name)
cc_name = '{}_char_tokenizer.pickle'.format(self.mod_name)
lookup_name = '{}_pos_lookup.pickle'.format(self.mod_name)
mod_files = [self.mod_name +".h5", tt_name, cc_name, lookup_name]
for file_name in mod_files:
if file_name not in os.listdir(os.getcwd()):
print(file_name)
client.download_file(databuck, mod_path+ file_name, file_name)
with open(tt_name, 'rb') as handle:
self.text_tokenizer = pickle.load(handle)
with open(cc_name, 'rb') as handle:
self.char_tokenizer = pickle.load(handle)
with open(lookup_name, 'rb') as handle:
self.pos_lookup = pickle.load(handle)
self.model = keras.models.load_model(mod_name_ext)
然后我准备数据并进行如下推断:
def create_char_arrs(text):
dummy = 'nada'
char_arrs = list()
terms = text.split()
doc_res = list()
for term in terms[0:50]:
res = char_tokenizer.texts_to_sequences([term])
doc_res.append(res[0])
doc_res = sequence.pad_sequences(doc_res, maxlen=18, padding='post')
char_arrs.append(doc_res)
char_arrs = sequence.pad_sequences(char_arrs, maxlen=50, padding='post')
return char_arrs
oos = text_tokenizer.texts_to_sequences([x])
oos = sequence.pad_sequences(oos, maxlen=max_length, padding='post', value=36)
ch = create_char_arrs(x)
res = model.predict([ch, oos])
其结果是它只是冻结了内核,没有错误消息或任何东西。
我之前已经保存并重新加载了许多Keras模型,但从未遇到过此问题。
任何帮助将不胜感激!