joblib和pickle模型持久化保存及加载

训练模型的时候,通常希望把模型保存下来,方便后面可以做测试的时候交叉验证。下面简单介绍两种保存模型的方法:基于joblib和基于pickle的保存和加载。

1. 使用joblib

这里joblib是来自于sklearn.externals,你需要先安装这个包,之后可以引用这个包进行保存或者加载模型。

from sklearn.externals import joblib

下面以tokenizer的例子说明一下

#!/usr/bin/python
from keras.preprocessing.text import Tokenizer
from sklearn.externals import joblib

# Tokenizer
num_words = 3 # 设置的最大词数
tk = Tokenizer(num_words=num_words + 1, oov_token='UNK') # 因为需要增加未登录的词,所有+1
texts = ['今天 天气 不错', '明天 天气 还行', '这是 什么 天气 啊']
tk.fit_on_texts(texts)
tk.word_index = {e:i for e, i in tk.word_index.items() if i <= num_words}
tk.word_index[tk.oov_token] = num_words + 1
print(tk.word_index)

sequences = tk.texts_to_sequences(["这是 什么 天气 呀", '我的 天 呐'])
print("original model:")
print(sequences)

# 使用joblib保存模型并加载模型
joblib.dump(tk, 'data_tk_joblib_result.pkl') # 模型保存
tokenizer = joblib.load('data_tk_joblib_result.pkl') # 模型加载
sequences = tokenizer.texts_to_sequences(["这是 什么 天气 呀", '我的 天 呐'])
print("saved model:")
print(sequences)

打印结果为:

{'UNK': 4, '天气': 2, '今天': 3}
original model:
[[4, 4, 2, 4], [4, 4, 4]]
saved model:
[[4, 4, 2, 4], [4, 4, 4]]

2. 使用pickle

使用pickle保存和加载模型需要引入pickle包

import pickle

以tokenizer为例:

#!/usr/bin/python
from keras.preprocessing.text import Tokenizer
import pickle

# Tokenizer
num_words = 3 # 设置的最大词数
tk = Tokenizer(num_words=num_words + 1, oov_token='UNK') # 因为需要增加未登录的词,所有+1
texts = ['今天 天气 不错', '明天 天气 还行', '这是 什么 天气 啊']
tk.fit_on_texts(texts)
tk.word_index = {e:i for e, i in tk.word_index.items() if i <= num_words}
tk.word_index[tk.oov_token] = num_words + 1
print(tk.word_index)

sequences = tk.texts_to_sequences(["这是 什么 天气 呀", '我的 天 呐'])
print("original model:")
print(sequences)

# 使用joblib保存模型并加载模型
f = open('data_tk_pickle_result.pkl', 'wb')
pickle.dump(tk, f) # 模型保存
f.close()
fl = open('data_tk_pickle_result.pkl', 'rb')
tokenizer2 = pickle.load(fl) # 模型载入
fl.close()
sequences = tokenizer2.texts_to_sequences(["这是 什么 天气 呀", '我的 天 呐'])
print("saved model:")
print(sequences)

输出结果为:

{'UNK': 4, '天气': 2, '今天': 3}
original model:
[[4, 4, 2, 4], [4, 4, 4]]
saved model:
[[4, 4, 2, 4], [4, 4, 4]]

可以发现两套方案在保存前和保存之后重新加载,同样的输入可以得到同样的输出。

你可能感兴趣的:(pickle,joblib,python,模型)