最近接触了tensorflow的object detection API发现里面读取的预先训练模型都是pb格式。

谷歌推荐的保存模型的方式是保存模型为 PB 文件,它具有语言独立性,可独立运行,封闭的序列化格式,任何语言都可以解析它,它允许其他语言和深度学习框架读取、继续训练和迁移 TensorFlow 的模型。

它的主要使用场景是实现创建模型与使用模型的解耦, 使得前向推导 inference的代码统一。

另外的好处是保存为 PB 文件时候,模型的变量都会变成固定的,导致模型的大小会大大减小,适合在手机端运行。

还有一个就是,真正离线测试使用的时候,pb格式的数据能够保证数据不会更新变动,就是不会进行反馈调节啦。

保存 PB 文件的代码:

  1. import tensorflow as tf
  2. import os
  3. from tensorflow.python.framework import graph_util
  4. pb_file_path = os.getcwd()
  5. with tf.Session(graph=tf.Graph()) as sess:
  6. x = tf.placeholder(tf.int32, name='x')
  7. y = tf.placeholder(tf.int32, name='y')
  8. b = tf.Variable(1, name='b')
  9. xy = tf.multiply(x, y)
  10. # 这里的输出需要加上name属性
  11. op = tf.add(xy, b, name='op_to_store')
  12. sess.run(tf.global_variables_initializer())
  13. # convert_variables_to_constants 需要指定output_node_names,list(),可以多个
  14. constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph_def, ['op_to_store'])
  15. # 测试 OP
  16. feed_dict = {x: 10, y: 3}
  17. print(sess.run(op, feed_dict))
  18. # 写入序列化的 PB 文件
  19. with tf.gfile.FastGFile(pb_file_path+'model.pb', mode='wb') as f:
  20. f.write(constant_graph.SerializeToString())
  21. # 输出
  22. # INFO:tensorflow:Froze 1 variables.
  23. # Converted 1 variables to const ops.
  24. # 31

加载 PB 模型文件典型代码:

  1. from tensorflow.python.platform import gfile
  2. sess = tf.Session()
  3. with gfile.FastGFile(pb_file_path+'model.pb', 'rb') as f:
  4. graph_def = tf.GraphDef()
  5. graph_def.ParseFromString(f.read())
  6. sess.graph.as_default()
  7. tf.import_graph_def(graph_def, name='') # 导入计算图
  8. # 需要有一个初始化的过程
  9. sess.run(tf.global_variables_initializer())
  10. # 需要先复原变量
  11. print(sess.run('b:0'))
  12. # 1
  13. # 输入
  14. input_x = sess.graph.get_tensor_by_name('x:0')
  15. input_y = sess.graph.get_tensor_by_name('y:0')
  16. op = sess.graph.get_tensor_by_name('op_to_store:0')
  17. ret = sess.run(op, feed_dict={input_x: 5, input_y: 5})
  18. print(ret)
  19. # 输出 26

保存为 save model 格式也可以生成模型的 PB 文件,并且更加简单。

保存好以后到saved_model_dir目录下,会有一个saved_model.pb文件以及variables文件夹。顾名思义,variables保存所有变量,saved_model.pb用于保存模型结构等信息。

  1. import tensorflow as tf
  2. import os
  3. from tensorflow.python.framework import graph_util
  4. pb_file_path = os.getcwd()
  5. with tf.Session(graph=tf.Graph()) as sess:
  6. x = tf.placeholder(tf.int32, name='x')
  7. y = tf.placeholder(tf.int32, name='y')
  8. b = tf.Variable(1, name='b')
  9. xy = tf.multiply(x, y)
  10. # 这里的输出需要加上name属性
  11. op = tf.add(xy, b, name='op_to_store')
  12. sess.run(tf.global_variables_initializer())
  13. # convert_variables_to_constants 需要指定output_node_names,list(),可以多个
  14. constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph_def, ['op_to_store'])
  15. # 测试 OP
  16. feed_dict = {x: 10, y: 3}
  17. print(sess.run(op, feed_dict))
  18. # 写入序列化的 PB 文件
  19. with tf.gfile.FastGFile(pb_file_path+'model.pb', mode='wb') as f:
  20. f.write(constant_graph.SerializeToString())
  21. # INFO:tensorflow:Froze 1 variables.
  22. # Converted 1 variables to const ops.
  23. # 31
  24. # 官网有误,写成了 saved_model_builder
  25. builder = tf.saved_model.builder.SavedModelBuilder(pb_file_path+'savemodel')
  26. # 构造模型保存的内容,指定要保存的 session,特定的 tag,
  27. # 输入输出信息字典,额外的信息
  28. builder.add_meta_graph_and_variables(sess,
  29. ['cpu_server_1'])
  30. # 添加第二个 MetaGraphDef
  31. #with tf.Session(graph=tf.Graph()) as sess:
  32. # ...
  33. # builder.add_meta_graph([tag_constants.SERVING])
  34. #...
  35. builder.save() # 保存 PB 模型

这种方法对应的导入模型的方法:

  1. with tf.Session(graph=tf.Graph()) as sess:
  2. tf.saved_model.loader.load(sess, ['cpu_1'], pb_file_path+'savemodel')
  3. sess.run(tf.global_variables_initializer())
  4. input_x = sess.graph.get_tensor_by_name('x:0')
  5. input_y = sess.graph.get_tensor_by_name('y:0')
  6. op = sess.graph.get_tensor_by_name('op_to_store:0')
  7. ret = sess.run(op, feed_dict={input_x: 5, input_y: 5})
  8. print(ret)
  9. # 只需要指定要恢复模型的 session,模型的 tag,模型的保存路径即可,使用起来更加简单

这样和之前的导入 PB 模型一样,也是要知道tensor的name。那么如何可以在不知道tensor name的情况下使用呢,实现彻底的解耦呢? 给add_meta_graph_and_variables方法传入第三个参数,signature_def_map即可。

参考:

https://zhuanlan.zhihu.com/p/32887066

tensorflow保存数据为.pb格式和加载.pb文件(转)相关推荐

  1. R语言构建xgboost模型:模型的保存(xgb.save)和加载(xgb.load)、或者保存为R二进制文件(xgb.save.raw R binary vector)

    R语言构建xgboost模型:模型的保存(xgb.save)和加载(xgb.load).或者保存为R二进制文件(xgb.save.raw,R binary vector) 目录

  2. 数据提取、转换和加载 - ETL工具

    ETL,Extraction-Transformation-Loading的缩写,中文名称为数据提取.转换和加载. ETL工具有:OWB(Oracle Warehouse Builder).ODI(O ...

  3. ELF文件的格式和加载过程

    (一) ELF 文件的格式       ELF 文件类型 (1) 可重定位文件( .o 目标文件) : 用于链接创建可执行文件或 so 文件 (2) 可执行文件                     ...

  4. MATLAB保存数据为dat格式,[转载] Matlab中的数据以.txt或.dat格式保存

    具体命令是: 使用save * .txt -asciix x是一个变量 *. txt是文件名,该文件存储在当前工作目录中,然后在打开后可以将其打开,数据可以以指数形式保存. 看下面的例子: a = [ ...

  5. c++保存数据为txt格式

    本文是记录一个常用功能,经常使用但每次查找都非常不方便,因此记录一下过程,以便查阅. 注意:保存的数据为浮点数时,在向文件流中添加数据时可以通过setprecision(4)设置保存数据的小数点位数 ...

  6. labwindows下保存数据为csv格式

    labwindows下保留的依然是c的风格,用久了visual studio 2012突然有点不习惯,不过保存数据功能基本跟visual studio下一致,毕竟都是用c写的,只不过版本上会有点区别: ...

  7. Matlab--存储和加载.mat文件形式的数据

    (注意:matlab中的m*n维度,指的是m行,n列) 1.存储 %指定文件夹存储工作空间中所有变量 save('D:\Matlab\Project\filename.mat'); %当前文件夹存储工 ...

  8. 4.平凡之路-封装帮助类和加载属性文件

    MyBatisUtils.java 文件 /*** 知识点:* final 修饰类 : 不能被基础* 修饰方法 : 不能被重写* 修改变量 : 常量*/ public final class MyBa ...

  9. python读取grib2数据_用Python加载grib2文件

    我正在尝试加载grib2文件,我不确定文件是问题还是我试图加载它们的方式.在 这些文件是从here中提取的(我不是从这里下载的,而是从同事的文件夹中复制的,所以它们应该是相同的文件-,但是我也尝试插入 ...

最新文章

  1. sar sensor传感器的作用_传感器攻防战-惯导IMU
  2. 对象存储与块存储、文件存储等对比
  3. 解决linux服务器掉包问题
  4. 5G是卡位未来的重要基础设施 物联网已成为新的攻击入口
  5. linux中grep命令查找目录下,linux中查找grep与find命令的使用
  6. big sur删除snapshot_法国Labarthe-Sur-Lèze公立中学 | LCR Architectes
  7. GDUFE ACM-1045
  8. 【恋上数据结构】图代码实现、最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Bellman-Ford、Floyd)
  9. linux大一实验报告,linux实验报告
  10. 陈彬 2019-1-17
  11. SVN源码泄露漏洞总结
  12. 解决 ModuleNotFoundError: No module named ‘PySide2.QtUiTools‘
  13. 谷歌VR展示360度全景图
  14. python 进化树_7款物种分类(进化树地位)信息检索工具使用方法
  15. python-伪随机数生成器
  16. 【线性代数】——向量于不同基下的“线性变换”与对角化有感
  17. Android Studio实现数独小游戏,休闲益智
  18. 广州市长温国辉:用“加减乘除法”发展民营经济
  19. ajax与Java后台互相传数据
  20. 深入了解OpenGL——颜色混合

热门文章

  1. python----关键字参数
  2. 【Bug Fix】Error : Can#39;t create table #39;moshop_1.#sql-534_185#39; (errno: 150)
  3. vs 2017 建立 php,WIN10系统下OSG+VS2017或者vs2019环境搭建
  4. ubuntu 设置定时任务
  5. 浏览器数据库 IndexedDB(一) 概述
  6. [linux]centos6.3安装flash插件rpm方式
  7. idea开发工具的一些实用技巧
  8. 转-python面试题目集锦(100道部分附答案)
  9. history模式 nginx配置_Vue history模式Nginx配置
  10. python中collections中的counter类_了解Python的collections.Counter类型