sklearn,keras,tensorflow 模型本地保存与导入

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/daxiaofan/article/details/71189015

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'))
展开阅读全文

没有更多推荐了,返回首页