1. 程式人生 > >sklearn,keras,tensorflow 模型本地儲存與匯入

sklearn,keras,tensorflow 模型本地儲存與匯入

sklearn,keras,tensorflow模型本地儲存與匯入

  • sklearn的模型儲存與匯入
  • keras的模型儲存與匯入

    模型的網路結構與權重的儲存
    模型的網路結構儲存
    模型的權重的儲存
    模型的匯入

  • tensorflow的模型儲存與匯入

    模型的儲存與匯入
    計算圖的儲存與匯入

資料集

訓練集

import numpy as np
import matplotlib.pyplot as plt
from sklearn.externals import joblib
from sklearn.linear_model import
LinearRegression x=np.arange(10) y=x x=x.reshape(len(x),1) plt.plot(x,y,'r+',markersize=15,markeredgewidth=5) plt.show()

這裡寫圖片描述

測試集

test_x=np.arange(20)
test_x=test_x.reshape(len(test_x),1)

sklearn模型的儲存與匯入

sklearn模型的儲存

Lr=LinearRegression()
Lr.fit(x,y)
joblib.dump(Lr,'./Lr.model')#儲存

sklearn模型的匯入

model=joblib.load('./Lr.model')#匯入
y_test=model.predict(test_x)
plt.plot(x,y,'r+',markersize=15,markeredgewidth=5)
plt.plot(test_x,y_test)
plt.show()

這裡寫圖片描述

keras的模型儲存與匯入

模型的網路結構與權重的儲存

from keras.layers import Dense
from keras.models import Sequential
from keras.metrics import MSE
def getmodel
():
model=Sequential() model.add(Dense(input_dim=1,output_dim=2,activation='linear')) model.add(Dense(output_dim=1,activation='linear')) return model model=getmodel() model.compile(optimizer='sgd',loss=MSE) model.fit(x,y,nb_epoch=20) model.save('./dnn.h5')#這個方法將網路結構與權重一起儲存到dnn.h5中

模型的網路結構儲存

model_json=model.to_json()#此方法將模型網路結構儲存到json中
f=open('./knn_model.json',mode='w')#將json寫到本地
f.write(model_json)
f.close()
model_yaml=model.to_yaml()#此方法將模型網路結構儲存到yaml中
f=open('./knn_model.yaml',mode='w')#將yaml寫到本地
f.write(model_yaml)
f.close()

模型的權重的儲存

model.save_weights('./dnn_weight.h5')#此方法將模型的權重儲存到本地

模型的匯入

方法1:

from keras.models import load_model
dnn=load_model('./dnn.h5')#直接將模型全部匯入
test_y=dnn.predict(test_x)
plt.plot(x,y,'r+',markersize=15,markeredgewidth=5)
plt.plot(test_x,test_y)
plt.show()

這裡寫圖片描述
方法2:

mlp=getmodel()#此函式為上面寫的網路結構
mlp.load_weights('./dnn_weight.h5')#方法將權重匯入到網路結構中
test_y=mlp.predict(test_x)
plt.plot(x,y,'r+',markersize=15,markeredgewidth=5)
plt.plot(test_x,test_y)
plt.show()

方法3:

f=open('./knn_model.json',mode='r')#將json讀入
model_json=f.read()
f.close()
from keras.models import model_from_json
model_j=model_from_json(model_json)#從json中建立模型的網路結構
model_j.load_weights('./dnn_weight.h5')#方法將權重匯入到網路結構中
test_y=model_j.predict(test_x)
plt.plot(x,y,'r+',markersize=15,markeredgewidth=5)
plt.plot(test_x,test_y)
plt.show()

方法4:

#同理儲存到yaml中
from keras.models import model_from_yaml
f=open('./knn_model.yaml',mode='r')
model_yaml=f.read()
f.close()
model_y=model_from_yaml(model_yaml)
model_y.load_weights('./dnn_weight.h5')
test_y=model_y.predict(test_x)
plt.plot(x,y,'r+',markersize=15,markeredgewidth=5)
plt.plot(test_x,test_y)
plt.show()

tensorflow的模型儲存與匯入

模型的儲存

import tensorflow as tf
v1=tf.Variable(tf.constant(0),name='v1')
v2=tf.Variable(tf.constant(1),name='v2')
add=tf.add(v1,v2)
print(add)
saver=tf.train.Saver()
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    saver.save(sess,'C:\\Users\\a\\Desktop\\g\\path\\data-all.chpt')
    print(sess.run(add))

通過saver.save函式將tensorflow模型儲存到path中,檔案目錄下會出現多個檔案。第一個檔案data-all.chpt.meta,它儲存了tensorflow計算圖的結構。其中一個檔案儲存了程式中每一個變數的取值。

模型的匯入

方法1:
先將圖構建好,saver.restore函式將path裡模型檔案中的張量匯入到相應的變數中

import tensorflow as tf
v3=tf.Variable(tf.constant(0),name='v1')
v4=tf.Variable(tf.constant(1),name='v2')
add=tf.add(v3,v4)
saver=tf.train.Saver({'v1':v3,'v2':v4})
with tf.Session() as sess:
    saver.restore(sess,'C:\\Users\\a\\Desktop\\g\\path\\data-all.chkp')
    print(sess.run(add))

方法2:
data-all.chkp.meta為計算圖檔案,所以可以通過tf.train.import_meta_graph函式將圖先引進,
然後通過saver.restore,將檔案中的張量匯入到相應的變數中

import tensorflow as tf

saver=tf.train.import_meta_graph('C:\\Users\\a\\Desktop\\g\\path\\data-all.chkp.meta')
with tf.Session() as sess:
    add=sess.graph.get_tensor_by_name('Add:0')
    saver.restore(sess,'C:\\Users\\a\\Desktop\\g\\path\\data-all.chkp')
    print(sess.run(add))

計算圖的儲存

方法1:
通過convert_variables_to_constants函式可以將計算圖中的變數及其取值通過常量的方式儲存,這個tensorflow計算圖可以統一存放在一個檔案中。

import tensorflow as tf
from tensorflow.python.framework import graph_util

v1=tf.Variable(tf.constant(1.0,shape=[1]),name="v1")
v2=tf.Variable(tf.constant(2.0,shape=[1]),name="v2")
result=v1+v2
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    graph_def=tf.get_default_graph().as_graph_def()
    output_graph_def=graph_util.convert_variables_to_constants(sess,graph_def,['add'])
    with tf.gfile.GFile("C:\\Users\\a\\Desktop\\g\\path\\pb_test1.pb","wb") as f:
        f.write(output_graph_def.SerializeToString())
        f.close()

方法2:
通過tf.train.write_graph方法將圖中的graph_def部分直接儲存到路徑裡的檔案中,我們只需要這一部分就可以完成從輸入層到輸出層的計算。

import tensorflow as tf

graph=tf.Graph()
with graph.as_default():
    v1=tf.constant(0,name='v1')
    v2=tf.constant(1,name='v2')
    print(v1)
    add=tf.add(v1,v2)
    print(add)
    graph_def=graph.as_graph_def()
    sess=tf.Session()
    sess.run(tf.global_variables_initializer())
    tf.train.write_graph(graph_def,"C:\\Users\\a\\Desktop\\g\\path\\",name="graph.pb",as_text=False)
    sess.close()

計算圖的匯入

import tensorflow as tf
from tensorflow.python.platform import gfile
path="C:\\Users\\a\\Desktop\g\\path\\pb_test1.pb"

with tf.Graph().as_default():
    output_graph_def = tf.GraphDef()
    with gfile.GFile(path,'rb') as f:
        output_graph_def.ParseFromString(f.read())
    _ = tf.import_graph_def(output_graph_def,name='')
    with tf.Session() as sess:
        add=sess.graph.get_tensor_by_name("add:0")
        print(sess.run(add))
        print(sess.run('v1:0'))