一、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程序实现

[python] view plain copy

 
  1. # 本文件程序为配合教材及学习进度渐进进行,请按照注释分段执行
  2. # 执行时要注意IDE的当前工作过路径,最好每段重启控制器一次,输出结果更准确
  3. # Part1: 通过tf.train.Saver类实现保存和载入神经网络模型
  4. # 执行本段程序时注意当前的工作路径
  5. import tensorflow as tf
  6. v1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1")
  7. v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2")
  8. result = v1 + v2
  9. saver = tf.train.Saver()
  10. with tf.Session() as sess:
  11. sess.run(tf.global_variables_initializer())
  12. saver.save(sess, "Model/model.ckpt")
  13. # Part2: 加载TensorFlow模型的方法
  14. import tensorflow as tf
  15. v1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1")
  16. v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2")
  17. result = v1 + v2
  18. saver = tf.train.Saver()
  19. with tf.Session() as sess:
  20. saver.restore(sess, "./Model/model.ckpt") # 注意此处路径前添加"./"
  21. print(sess.run(result)) # [ 3.]
  22. # Part3: 若不希望重复定义计算图上的运算,可直接加载已经持久化的图
  23. import tensorflow as tf
  24. saver = tf.train.import_meta_graph("Model/model.ckpt.meta")
  25. with tf.Session() as sess:
  26. saver.restore(sess, "./Model/model.ckpt") # 注意路径写法
  27. print(sess.run(tf.get_default_graph().get_tensor_by_name("add:0"))) # [ 3.]
  28. # Part4: tf.train.Saver类也支持在保存和加载时给变量重命名
  29. import tensorflow as tf
  30. # 声明的变量名称name与已保存的模型中的变量名称name不一致
  31. u1 = tf.Variable(tf.constant(1.0, shape=[1]), name="other-v1")
  32. u2 = tf.Variable(tf.constant(2.0, shape=[1]), name="other-v2")
  33. result = u1 + u2
  34. # 若直接生命Saver类对象,会报错变量找不到
  35. # 使用一个字典dict重命名变量即可,{"已保存的变量的名称name": 重命名变量名}
  36. # 原来名称name为v1的变量现在加载到变量u1(名称name为other-v1)中
  37. saver = tf.train.Saver({"v1": u1, "v2": u2})
  38. with tf.Session() as sess:
  39. saver.restore(sess, "./Model/model.ckpt")
  40. print(sess.run(result)) # [ 3.]
  41. # Part5: 保存滑动平均模型
  42. import tensorflow as tf
  43. v = tf.Variable(0, dtype=tf.float32, name="v")
  44. for variables in tf.global_variables():
  45. print(variables.name) # v:0
  46. ema = tf.train.ExponentialMovingAverage(0.99)
  47. maintain_averages_op = ema.apply(tf.global_variables())
  48. for variables in tf.global_variables():
  49. print(variables.name) # v:0
  50. # v/ExponentialMovingAverage:0
  51. saver = tf.train.Saver()
  52. with tf.Session() as sess:
  53. sess.run(tf.global_variables_initializer())
  54. sess.run(tf.assign(v, 10))
  55. sess.run(maintain_averages_op)
  56. saver.save(sess, "Model/model_ema.ckpt")
  57. print(sess.run([v, ema.average(v)])) # [10.0, 0.099999905]
  58. # Part6: 通过变量重命名直接读取变量的滑动平均值
  59. import tensorflow as tf
  60. v = tf.Variable(0, dtype=tf.float32, name="v")
  61. saver = tf.train.Saver({"v/ExponentialMovingAverage": v})
  62. with tf.Session() as sess:
  63. saver.restore(sess, "./Model/model_ema.ckpt")
  64. print(sess.run(v)) # 0.0999999
  65. # Part7: 通过tf.train.ExponentialMovingAverage的variables_to_restore()函数获取变量重命名字典
  66. import tensorflow as tf
  67. v = tf.Variable(0, dtype=tf.float32, name="v")
  68. # 注意此处的变量名称name一定要与已保存的变量名称一致
  69. ema = tf.train.ExponentialMovingAverage(0.99)
  70. print(ema.variables_to_restore())
  71. # {'v/ExponentialMovingAverage': <tf.Variable 'v:0' shape=() dtype=float32_ref>}
  72. # 此处的v取自上面变量v的名称name="v"
  73. saver = tf.train.Saver(ema.variables_to_restore())
  74. with tf.Session() as sess:
  75. saver.restore(sess, "./Model/model_ema.ckpt")
  76. print(sess.run(v)) # 0.0999999
  77. # Part8: 通过convert_variables_to_constants函数将计算图中的变量及其取值通过常量的方式保存于一个文件中
  78. import tensorflow as tf
  79. from tensorflow.python.framework import graph_util
  80. v1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1")
  81. v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2")
  82. result = v1 + v2
  83. with tf.Session() as sess:
  84. sess.run(tf.global_variables_initializer())
  85. # 导出当前计算图的GraphDef部分,即从输入层到输出层的计算过程部分
  86. graph_def = tf.get_default_graph().as_graph_def()
  87. output_graph_def = graph_util.convert_variables_to_constants(sess,
  88. graph_def, ['add'])
  89. with tf.gfile.GFile("Model/combined_model.pb", 'wb') as f:
  90. f.write(output_graph_def.SerializeToString())
  91. # Part9: 载入包含变量及其取值的模型
  92. import tensorflow as tf
  93. from tensorflow.python.platform import gfile
  94. with tf.Session() as sess:
  95. model_filename = "Model/combined_model.pb"
  96. with gfile.FastGFile(model_filename, 'rb') as f:
  97. graph_def = tf.GraphDef()
  98. graph_def.ParseFromString(f.read())
  99. result = tf.import_graph_def(graph_def, return_elements=["add:0"])
  100. print(sess.run(result)) # [array([ 3.], dtype=float32)]

TensorFlow模型保存和提取方法的更多相关文章

  1. tensorflow 模型保存与加载 和TensorFlow serving + grpc + docker项目部署

    TensorFlow 模型保存与加载 TensorFlow中总共有两种保存和加载模型的方法.第一种是利用 tf.train.Saver() 来保存,第二种就是利用 SavedModel 来保存模型,接 ...

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

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

  3. TensorFlow 模型保存/载入

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

  4. Tensorflow模型保存与加载

    在使用Tensorflow时,我们经常要将以训练好的模型保存到本地或者使用别人已训练好的模型,因此,作此笔记记录下来. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提 ...

  5. 10 Tensorflow模型保存与读取

    我们的模型训练出来想给别人用,或者是我今天训练不完,明天想接着训练,怎么办?这就需要模型的保存与读取.看代码: import tensorflow as tf import numpy as np i ...

  6. 一份快速完整的Tensorflow模型保存和恢复教程(译)(转载)

    该文章转自https://blog.csdn.net/sinat_34474705/article/details/78995196 我在进行图像识别使用ckpt文件预测的时候,这个文章给我提供了极大 ...

  7. 转 tensorflow模型保存 与 加载

    使用tensorflow过程中,训练结束后我们需要用到模型文件.有时候,我们可能也需要用到别人训练好的模型,并在这个基础上再次训练.这时候我们需要掌握如何操作这些模型数据.看完本文,相信你一定会有收获 ...

  8. tensorflow 模型保存后的加载路径问题

    import tensorflow as tf #保存模型 saver = tf.train.Saver() saver.save(sess, "e://code//python//test ...

  9. tensorflow 模型保存

    1.首先 saver = tf.train.Saver(max_to_keep=1)新建一个saver,max_to_keep是说只保留最后一轮的训练结果 2.使用save方法保存模型 saver.s ...

随机推荐

  1. 机器学习算法实现解析——libFM之libFM的模型处理部分

    本节主要介绍的是libFM源码分析的第三部分--libFM的模型处理. 3.1.libFM中FM模型的定义 libFM模型的定义过程中主要包括模型中参数的设置及其初始化,利用模型对样本进行预测.在li ...

  2. 使用wlan接收器经常重新登录怎么办

    wlan接收器是一个大功率的网卡,能够接受耿远距离的无线网络,在农村和乡镇很普及,很多家庭里都是用这个装置来接受远距离的CMCC信号.但是在使用的时候会经常出现一些问题,例如我们登陆以后,还没等上网就 ...

  3. 剑指offer-第六章面试中的各项能力(翻转单词的顺序VS左旋转字符串)

    //题目1:翻转单词顺序例如“Hello world!”翻转后为world! Hello. //思路:首先翻转整个字符串,然后再分别翻转每个单词. //题目2:左旋转字符串,是将字符串的前面几个(n) ...

  4. ACM学习历程—TopCoder SRM691 Div2

    这是我的第一次打TC,感觉打的一般般吧.不过TC的题目确实挺有意思的. 由于是用客户端打的,所以就不发题目地址了. 300分的题: 这题大意是有一段序列只包含+和数字0~9. 一段序列的操作是,从头扫 ...

  5. npm 私服工具verdaccio 安装配置试用

      1. 安装 npm install -g verdaccio 2. 启动 verdaccio // 界面显示信息 Verdaccio doesn't need superuser privileg ...

  6. gatsbyjs 了解

    1.  模型 2. 总结&&资料 从模型上可以看出和jamstack 提出的架构模型比较相似,可以看成是一个具体的实现,功能还是比较强大的 https://www.gatsbyjs.o ...

  7. hadoop文件IO

    InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符.它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集. Input ...

  8. 笔记:LIR2032 电池充电记录

    笔记:LIR2032 电池充电记录 LIR2032 电池是锂电池,形状和 CR2032 一样,只不过可以充电,材料是锂离子. 一个单颗的 LIR2032 电池容量只有 40mAH,容量很小. 那么就需 ...

  9. Tomcat && Servlet(1)

    一.概述 为了让web服务器和web应用程序进行访问交互,servlet是这个交互的标准接口,web服务器必须符合servlet标准,web应用应该实现servlet接口. tomcat是一个符合se ...

  10. Linux安装python

    1.打开终端,输入:wget https://www.python.org/ftp/python/3.5.0/Python-3.5.0b4.tgz下载完毕后 2.输入解压命令:tar –zxvf Py ...