我已经按照以下步骤(广泛地)使用Keras库训练了一个情绪分类器模型。
现在,使用此模型进行评分,我能够将模型保存到文件并从文件加载。但是我没有找到将Tokenizer对象保存到文件的方法。如果没有这个,我每次需要得到一个句子时都必须处理语料库。有办法解决这个问题吗?
答案 0 :(得分:53)
最常见的方法是使用pickle
或joblib
。这里有一个示例,说明如何使用pickle
来保存Tokenizer
:
import pickle
# saving
with open('tokenizer.pickle', 'wb') as handle:
pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)
# loading
with open('tokenizer.pickle', 'rb') as handle:
tokenizer = pickle.load(handle)
答案 1 :(得分:7)
已接受的答案清楚地说明了如何保存令牌生成器。以下是对(通常)在拟合或保存后对评分的问题的注释。假设列表texts
由两个列表Train_text
和Test_text
组成,其中Test_text
中的令牌集是{{1}中的令牌集的子集}(乐观假设)。与首先调用Train_text
然后调用fit_on_texts(Train_text)
相比,texts_to_sequences(Test_text)
给出了fit_on_texts(texts)
的不同结果。
具体示例:
text_to_sequences(Test_text)
结果:
from keras.preprocessing.text import Tokenizer
docs = ["A heart that",
"full up like",
"a landfill",
"no surprises",
"and no alarms"
"a job that slowly"
"Bruises that",
"You look so",
"tired happy",
"no alarms",
"and no surprises"]
docs_train = docs[:7]
docs_test = docs[7:]
# EXPERIMENT 1: FIT TOKENIZER ONLY ON TRAIN
T_1 = Tokenizer()
T_1.fit_on_texts(docs_train) # only train set
encoded_train_1 = T_1.texts_to_sequences(docs_train)
encoded_test_1 = T_1.texts_to_sequences(docs_test)
print("result for test 1:\n%s" %(encoded_test_1,))
# EXPERIMENT 2: FIT TOKENIZER ON BOTH TRAIN + TEST
T_2 = Tokenizer()
T_2.fit_on_texts(docs) # both train and test set
encoded_train_2 = T_2.texts_to_sequences(docs_train)
encoded_test_2 = T_2.texts_to_sequences(docs_test)
print("result for test 2:\n%s" %(encoded_test_2,))
当然,如果不满足上述乐观假设,并且Test_text中的标记集与Train_test的标记集不相交,则测试1会得到一个空括号result for test 1:
[[3], [10, 3, 9]]
result for test 2:
[[1, 19], [5, 1, 4]]
答案 2 :(得分:3)
Tokenizer类具有将日期保存为JSON格式的功能:
{
"userId": 0,
"id": 0,
"title": null
}
可以使用tokenizer_json = tokenizer.to_json()
with io.open('tokenizer.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(tokenizer_json, ensure_ascii=False))
中的tokenizer_from_json
函数来加载数据:
keras_preprocessing.text
答案 3 :(得分:1)
我在keras Repo中创建了问题https://github.com/keras-team/keras/issues/9289。在更改API之前,该问题有一个指向gist的链接,该gist具有代码,用于演示如何保存和恢复标记生成器,而无需使用标记生成器所适用的原始文档。我更喜欢将所有模型信息存储在JSON文件中(因为原因,但主要是混合JS / Python环境),这样就可以实现,即使使用sort_keys = True
答案 4 :(得分:0)
我在 link 的以下 @thusv89 处找到了以下片段。
保存对象:
import pickle
with open('data_objects.pickle', 'wb') as handle:
pickle.dump(
{'input_tensor': input_tensor,
'target_tensor': target_tensor,
'inp_lang': inp_lang,
'targ_lang': targ_lang,
}, handle, protocol=pickle.HIGHEST_PROTOCOL)
加载对象:
with open("dataset_fr_en.pickle", 'rb') as f:
data = pickle.load(f)
input_tensor = data['input_tensor']
target_tensor = data['target_tensor']
inp_lang = data['inp_lang']
targ_lang = data['targ_lang']