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]]

可以發現兩套方案在保存前和保存之後重新加載,同樣的輸入可以得到同樣的輸出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章