2019独角兽企业重金招聘Python工程师标准>>>

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

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

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 tfv1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1")
v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2")
result = v1 + v2saver = 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 tfv1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1")
v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2")
result = v1 + v2saver = tf.train.Saver()with tf.Session() as sess:saver.restore(sess, "./Model/model.ckpt") # 注意此处路径前添加"./"print(sess.run(result)) # [ 3.]# Part3: 若不希望重复定义计算图上的运算,可直接加载已经持久化的图import tensorflow as tfsaver = 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 tfv = tf.Variable(0, dtype=tf.float32, name="v")
for variables in tf.global_variables():print(variables.name) # v:0ema = 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:0saver = 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 tfv = 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 tfv = 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_utilv1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1")
v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2")
result = v1 + v2with 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 gfilewith 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)]

转载于:https://my.oschina.net/u/2391658/blog/1585294

TensorFlow模型保存和提取方法相关推荐

  1. TensorFlow模型保存和提取方法(含滑动平均模型)

    一.TensorFlow模型保存和提取方法 1. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提取.tf.train.Saver对象saver的save方法将Tens ...

  2. TensorFlow模型保存和加载方法

    TensorFlow模型保存和加载方法 模型保存 import tensorflow as tfw1 = tf.Variable(tf.constant(2.0, shape=[1]), name=& ...

  3. Tensorflow 模型保存与恢复(2)使用SavedModel

    使用SavedModel 保存和恢复模型 本篇介绍使用SavedModel进行模型的保存与恢复. 其他相关: Tensorflow 模型保存与恢复(1)使用tf.train.Saver() Tenso ...

  4. TensorFlow 模型保存/载入的两种方法

    TensorFlow 模型保存/载入 我们在上线使用一个算法模型的时候,首先必须将已经训练好的模型保存下来.tensorflow保存模型的方式与sklearn不太一样,sklearn很直接,一个skl ...

  5. [tensorflow] 模型保存、加载与转换详解

    TensorFlow模型加载与转换详解 本次讲解主要涉及到TensorFlow框架训练时候模型文件的管理以及转换. 首先我们需要明确TensorFlow模型文件的存储格式以及文件个数: model_f ...

  6. keras/tensorflow 模型保存后重新加载准确率为0 model.save and load giving different result

    我在用别人的代码跑程序的时候遇到了这个问题: keras 模型保存后重新加载准确率为0 GitHub上有个issue:model.save and load giving different resu ...

  7. TensorFlow模型保存pb或ckpt

    Tensorflow的保存分为三种:1. checkpoint模式:2. pb模式:3. saved_model模式. https://www.zhihu.com/collection/6445044 ...

  8. Sklearn,TensorFlow,keras模型保存与读取

    一.sklearn模型保存与读取  1.保存 1 from sklearn.externals import joblib 2 from sklearn import svm 3 X = [[0, 0 ...

  9. 模型保存的序列化文件pb 什么是PB文件 pb是protocol(协议) buffer(缓冲)的缩写

    pb是protocol(协议) buffer(缓冲)的缩写 TensorFlow 模型保存为pb文件的解释,怎么使用pb文件/模型的Save and Restore_u014264373的博客-CSD ...

最新文章

  1. Java面试题技术类一
  2. C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)
  3. 解决问题 inner element must either be a resource reference or empty.
  4. 读文件 —— 读写配置文件
  5. Http Hijacker
  6. python地理数据处理 下载_python-doc/将Python用于地理空间数据处理.md at master · zhuxinyizhizun/python-doc · GitHub...
  7. stm32L0工程建立(HAL+IAR,无cubemx)
  8. Boost.Function 库示例
  9. DCMTK:用于创建和加载增强型CT对象的测试
  10. 工作流表单自定义功能的误区
  11. python 提升效率_@Python 程序员,如何最大化提升编码效率?
  12. html文本格式化意思,HTML文本格式化标签(Formatting)
  13. 微信小程序 - 商城项目 - 图片详情预览
  14. python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】
  15. 【Ubuntu版】制作U盘启动盘
  16. 常见的注册表操作及其含义
  17. 计算机辅助制造卜昆内容,西北工业大学07年硕士生入学考试专业课大纲(428计算机辅助制造)...
  18. CATIA Composer三维作业指导书
  19. 第29讲 常见算法(查找算法、递归算法、排序算法)
  20. pppoe服务器稳定性,如何设置PPPoE服务器应用

热门文章

  1. zookeeper单机和集群搭建过程详细步骤
  2. Mysql各个版本之间的比较
  3. linux命令地址,[命令] Linux IP 命令 IP(管理地址)
  4. The servlet name already exists.解决方法
  5. C# Process.Kill() 拒绝访问(Access Denied) 的解决方案
  6. Chrome启动后打开第一个网页很慢的解决方案
  7. 设置HttpClient的授权标头
  8. ros发布者退出后重新发布, 订阅者无法收到消息的解决办法
  9. android如何用代码实现界面ui
  10. oracle trigger 延迟执行_springboot中定时任务执行Quartz的使用