TensorFlow模型保存和提取的方法


Posted in Python onMarch 08, 2018

一、TensorFlow模型保存和提取方法

1. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提取。tf.train.Saver对象saver的save方法将TensorFlow模型保存到指定路径中,saver.save(sess,"Model/model.ckpt") ,实际在这个文件目录下会生成4个人文件:

TensorFlow模型保存和提取的方法

checkpoint文件保存了一个录下多有的模型文件列表,model.ckpt.meta保存了TensorFlow计算图的结构信息,model.ckpt保存每个变量的取值,此处文件名的写入方式会因不同参数的设置而不同,但加载restore时的文件路径名是以checkpoint文件中的“model_checkpoint_path”值决定的。

2. 加载这个已保存的TensorFlow模型的方法是saver.restore(sess,"./Model/model.ckpt") ,加载模型的代码中也要定义TensorFlow计算图上的所有运算并声明一个tf.train.Saver类,不同的是加载模型时不需要进行变量的初始化,而是将变量的取值通过保存的模型加载进来,注意加载路径的写法。若不希望重复定义计算图上的运算,可直接加载已经持久化的图,saver =tf.train.import_meta_graph("Model/model.ckpt.meta")

3.tf.train.Saver类也支持在保存和加载时给变量重命名,声明Saver类对象的时候使用一个字典dict重命名变量即可,{"已保存的变量的名称name": 重命名变量名},saver = tf.train.Saver({"v1":u1, "v2": u2})即原来名称name为v1的变量现在加载到变量u1(名称name为other-v1)中。

4. 上一条做的目的之一就是方便使用变量的滑动平均值。如果在加载模型时直接将影子变量映射到变量自身,则在使用训练好的模型时就不需要再调用函数来获取变量的滑动平均值了。载入时,声明Saver类对象时通过一个字典将滑动平均值直接加载到新的变量中,saver = tf.train.Saver({"v/ExponentialMovingAverage": v}),另通过tf.train.ExponentialMovingAverage的variables_to_restore()函数获取变量重命名字典。

此外,通过convert_variables_to_constants函数将计算图中的变量及其取值通过常量的方式保存于一个文件中。

二、TensorFlow程序实现

# 本文件程序为配合教材及学习进度渐进进行,请按照注释分段执行 
# 执行时要注意IDE的当前工作过路径,最好每段重启控制器一次,输出结果更准确 
 
 
# Part1: 通过tf.train.Saver类实现保存和载入神经网络模型 
 
# 执行本段程序时注意当前的工作路径 
import tensorflow as tf 
 
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 
 
saver = tf.train.Saver() 
 
with tf.Session() as sess: 
 sess.run(tf.global_variables_initializer()) 
 saver.save(sess, "Model/model.ckpt") 
 
 
# Part2: 加载TensorFlow模型的方法 
 
import tensorflow as tf 
 
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 
 
saver = tf.train.Saver() 
 
with tf.Session() as sess: 
 saver.restore(sess, "./Model/model.ckpt") # 注意此处路径前添加"./" 
 print(sess.run(result)) # [ 3.] 
 
 
# Part3: 若不希望重复定义计算图上的运算,可直接加载已经持久化的图 
 
import tensorflow as tf 
 
saver = tf.train.import_meta_graph("Model/model.ckpt.meta") 
 
with tf.Session() as sess: 
 saver.restore(sess, "./Model/model.ckpt") # 注意路径写法 
 print(sess.run(tf.get_default_graph().get_tensor_by_name("add:0"))) # [ 3.] 
 
 
# Part4: tf.train.Saver类也支持在保存和加载时给变量重命名 
 
import tensorflow as tf 
 
# 声明的变量名称name与已保存的模型中的变量名称name不一致 
u1 = tf.Variable(tf.constant(1.0, shape=[1]), name="other-v1") 
u2 = tf.Variable(tf.constant(2.0, shape=[1]), name="other-v2") 
result = u1 + u2 
 
# 若直接生命Saver类对象,会报错变量找不到 
# 使用一个字典dict重命名变量即可,{"已保存的变量的名称name": 重命名变量名} 
# 原来名称name为v1的变量现在加载到变量u1(名称name为other-v1)中 
saver = tf.train.Saver({"v1": u1, "v2": u2}) 
 
with tf.Session() as sess: 
 saver.restore(sess, "./Model/model.ckpt") 
 print(sess.run(result)) # [ 3.] 
 
 
# Part5: 保存滑动平均模型 
 
import tensorflow as tf 
 
v = tf.Variable(0, dtype=tf.float32, name="v") 
for variables in tf.global_variables(): 
 print(variables.name) # v:0 
 
ema = tf.train.ExponentialMovingAverage(0.99) 
maintain_averages_op = ema.apply(tf.global_variables()) 
for variables in tf.global_variables(): 
 print(variables.name) # v:0 
       # v/ExponentialMovingAverage:0 
 
saver = tf.train.Saver() 
 
with tf.Session() as sess: 
 sess.run(tf.global_variables_initializer()) 
 sess.run(tf.assign(v, 10)) 
 sess.run(maintain_averages_op) 
 saver.save(sess, "Model/model_ema.ckpt") 
 print(sess.run([v, ema.average(v)])) # [10.0, 0.099999905] 
 
 
# Part6: 通过变量重命名直接读取变量的滑动平均值 
 
import tensorflow as tf 
 
v = tf.Variable(0, dtype=tf.float32, name="v") 
saver = tf.train.Saver({"v/ExponentialMovingAverage": v}) 
 
with tf.Session() as sess: 
 saver.restore(sess, "./Model/model_ema.ckpt") 
 print(sess.run(v)) # 0.0999999 
 
 
# Part7: 通过tf.train.ExponentialMovingAverage的variables_to_restore()函数获取变量重命名字典 
 
import tensorflow as tf 
 
v = tf.Variable(0, dtype=tf.float32, name="v") 
# 注意此处的变量名称name一定要与已保存的变量名称一致 
ema = tf.train.ExponentialMovingAverage(0.99) 
print(ema.variables_to_restore()) 
# {'v/ExponentialMovingAverage': <tf.Variable 'v:0' shape=() dtype=float32_ref>} 
# 此处的v取自上面变量v的名称name="v" 
 
saver = tf.train.Saver(ema.variables_to_restore()) 
 
with tf.Session() as sess: 
 saver.restore(sess, "./Model/model_ema.ckpt") 
 print(sess.run(v)) # 0.0999999 
 
 
# Part8: 通过convert_variables_to_constants函数将计算图中的变量及其取值通过常量的方式保存于一个文件中 
 
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()) 
 # 导出当前计算图的GraphDef部分,即从输入层到输出层的计算过程部分 
 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("Model/combined_model.pb", 'wb') as f: 
  f.write(output_graph_def.SerializeToString()) 
 
 
# Part9: 载入包含变量及其取值的模型 
 
import tensorflow as tf 
from tensorflow.python.platform import gfile 
 
with tf.Session() as sess: 
 model_filename = "Model/combined_model.pb" 
 with gfile.FastGFile(model_filename, 'rb') as f: 
  graph_def = tf.GraphDef() 
  graph_def.ParseFromString(f.read()) 
 
 result = tf.import_graph_def(graph_def, return_elements=["add:0"]) 
 print(sess.run(result)) # [array([ 3.], dtype=float32)]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
Python实现处理逆波兰表达式示例
Jul 30 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
Python 分布式缓存之Reids数据类型操作详解
Jun 24 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
详解python中的lambda与sorted函数
Sep 04 Python
Python常用GUI框架原理解析汇总
Dec 07 Python
火车票抢票python代码公开揭秘!
Mar 08 #Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
Mar 08 #Python
python实现12306抢票及自动邮件发送提醒付款功能
Mar 08 #Python
TensorFlow模型保存/载入的两种方法
Mar 08 #Python
python2.7 json 转换日期的处理的示例
Mar 07 #Python
教你用Python创建微信聊天机器人
Mar 31 #Python
为什么入门大数据选择Python而不是Java?
Mar 07 #Python
You might like
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
php变量范围介绍
2012/10/15 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
Python如何发布程序的详细教程
2018/10/09 Python
详解Python传入参数的几种方法
2019/05/16 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
python for和else语句趣谈
2019/07/02 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
大四自我鉴定范文
2013/10/06 职场文书
大学生个人自我鉴定
2013/12/03 职场文书
物业保安主管岗位职责
2013/12/25 职场文书
小学开学标语
2014/07/01 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
经理助理岗位职责
2015/02/02 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
医院合作意向书范本
2015/05/08 职场文书
地道战观后感300字
2015/06/04 职场文书
导游词之广州陈家祠
2019/10/21 职场文书