TensorFlow模型保存和提取方法
一、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 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)]
TensorFlow模型保存和提取方法的更多相关文章
- tensorflow 模型保存与加载 和TensorFlow serving + grpc + docker项目部署
TensorFlow 模型保存与加载 TensorFlow中总共有两种保存和加载模型的方法.第一种是利用 tf.train.Saver() 来保存,第二种就是利用 SavedModel 来保存模型,接 ...
- TensorFlow模型保存和加载方法
TensorFlow模型保存和加载方法 模型保存 import tensorflow as tf w1 = tf.Variable(tf.constant(2.0, shape=[1]), name= ...
- TensorFlow 模型保存/载入
我们在上线使用一个算法模型的时候,首先必须将已经训练好的模型保存下来.tensorflow保存模型的方式与sklearn不太一样,sklearn很直接,一个sklearn.externals.jobl ...
- Tensorflow模型保存与加载
在使用Tensorflow时,我们经常要将以训练好的模型保存到本地或者使用别人已训练好的模型,因此,作此笔记记录下来. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提 ...
- 10 Tensorflow模型保存与读取
我们的模型训练出来想给别人用,或者是我今天训练不完,明天想接着训练,怎么办?这就需要模型的保存与读取.看代码: import tensorflow as tf import numpy as np i ...
- 一份快速完整的Tensorflow模型保存和恢复教程(译)(转载)
该文章转自https://blog.csdn.net/sinat_34474705/article/details/78995196 我在进行图像识别使用ckpt文件预测的时候,这个文章给我提供了极大 ...
- 转 tensorflow模型保存 与 加载
使用tensorflow过程中,训练结束后我们需要用到模型文件.有时候,我们可能也需要用到别人训练好的模型,并在这个基础上再次训练.这时候我们需要掌握如何操作这些模型数据.看完本文,相信你一定会有收获 ...
- tensorflow 模型保存后的加载路径问题
import tensorflow as tf #保存模型 saver = tf.train.Saver() saver.save(sess, "e://code//python//test ...
- tensorflow 模型保存
1.首先 saver = tf.train.Saver(max_to_keep=1)新建一个saver,max_to_keep是说只保留最后一轮的训练结果 2.使用save方法保存模型 saver.s ...
随机推荐
- Android 进阶10:进程通信之 Messenger 使用与解析
读完本文你将了解: Messenger 简介 Messenger 的使用 服务端 客户端 运行效果 使用小结 总结 代码地址 Thanks 前面我们介绍了 AIDL 的使用与原理,这篇文章来介绍下 A ...
- Delphi XE4 Upate1 更新升级记录.
一直没时间,这两天折腾了一下 升级了. 其实也可能修了老bug 引入新bug. 呵呵. 看看Emb 都修了什么吧. 我干脆是重新安装的. 虽然官方也有一个单独的update.exe. 从这些bu ...
- 【Android】SDK工具学习 - adb
ADB(Android Debug Bridge) 小白笔记 学习资料 adb简要介绍 adb 是一个 C/S 架构的命令行工具,主要由 3 部分组成: 运行在 PC 端的 Client : 可以通过 ...
- MyEclipse2014安装操作步骤+破解
第一步 第二步 第三步 第四步 第五步 第六步 破解操作步骤 1.安装完成 MyEclipse2014(适用于 2013 等版本)后,不要打开软件.解压破解文件压缩包,得到一下文件列表:双击 run. ...
- Consul做服务发现
使用Consul做服务发现的若干姿势 https://www.cnblogs.com/bossma/p/9756809.html 从2016年起就开始接触Consul,使用的主要目的就是做服务发现,后 ...
- python3 tesserocr 安装 来解决部分爬虫遇到的字符识别问题
1. OCR OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程.对于图形验证码来说,它们都是一些不规则的字符 ...
- AngularJS方法 —— angular.bootstrap
描述: 此方法用于手动加载angularjs模板 (官方翻译:注意基于端到端的测试不能使用此功能来引导手动加载,他们必须使用ngapp. angularjs会检测这个模板是否被浏览器加载或者加载多次并 ...
- 【转】IUSR和IIS_IUSRS
转自:http://blog.chinaunix.net/uid-20344928-id-3306130.html 概述 在早期的IIS版本中,随着IIS的安装,系统会创建一个IUSR_Mac ...
- GIT多人合作开发
. 建立代码仓库(专门用于团队开发的代码仓库) ============================================================================ ...
- UVA11178 Morley's Theorem
题意 PDF 分析 就按题意模拟即可,注意到对称性,只需要知道如何求其中一个. 注意A.B.C按逆时针排列,利用这个性质可以避免旋转时分类讨论. 时间复杂度\(O(T)\) 代码 #include&l ...