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聚类算法之凝聚层次聚类实例分析
Nov 20 Python
Python实现求笛卡尔乘积的方法
Sep 16 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 Python
Python多进程原理与用法分析
Aug 21 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
一篇文章搞懂Python的类与对象名称空间
Dec 10 Python
Python中Flask-RESTful编写API接口(小白入门)
Dec 11 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
python爬虫请求头设置代码
Jul 28 Python
解决Pymongo insert时会自动添加_id的问题
Dec 05 Python
python文件路径操作方法总结
Dec 21 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
php常见的魔术方法详解
2014/12/25 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python求解水仙花数的方法
2015/05/11 Python
python创建进程fork用法
2015/06/04 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
阿里云:Aliyun.com
2017/02/15 全球购物
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
公司业务主管岗位职责
2013/12/07 职场文书
电厂厂长岗位职责
2014/01/02 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
2019新员工心得体会
2019/06/25 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android