tensorflow使用freeze_graph.py将ckpt转为pb文件的方法


Posted in Python onApril 22, 2020

废话少说直接上代码样例如下

import tensorflow as tf
import os
from tensorflow.python.tools import freeze_graph
# 本来这个model本无需解释太多,但是这么多人不能耐下心来看,那么我简单的说一下吧
# network是你们自己定义的模型结构而已
# ps:
# def network(input):
# return tf.layers.max_pooling2d(input, 2, 2)
from model import network


os.environ['CUDA_VISIBLE_DEVICES']='2' #设置GPU


model_path = "path to /model.ckpt-0000" #设置model的路径,因新版tensorflow会生成三个文件,只需写到数字前


def main():

 tf.reset_default_graph()

 input_node = tf.placeholder(tf.float32, shape=(228, 304, 3)) #这个是你送入网络的图片大小,如果你是其他的大小自行修改
 input_node = tf.expand_dims(input_node, 0)
 flow = network(input_node)
 flow = tf.cast(flow, tf.uint8, 'out') #设置输出类型以及输出的接口名字,为了之后的调用pb的时候使用

 saver = tf.train.Saver()
 with tf.Session() as sess:

  saver.restore(sess, model_path)

  #保存图
  tf.train.write_graph(sess.graph_def, 'output_model/pb_model', 'model.pb')
  #把图和参数结构一起
  freeze_graph.freeze_graph('output_model/pb_model/model.pb', '', False, model_path, 'out','save/restore_all', 'save/Const:0', 'output_model/pb_model/frozen_model.pb', False, "")

 print("done")

if __name__ == '__main__':
 main()

这节是关于tensorflow的Freezing,字面意思是冷冻,可理解为整合合并;整合什么呢,就是将模型文件和权重文件整合合并为一个文件,主要用途是便于发布。

官方解释可参考:https://www.tensorflow.org/extend/tool_developers/#freezing 

这里我按我的理解翻译下,不对的地方请指正:
有一点令我们为比较困惑的是,tensorflow在训练过程中,通常不会将权重数据保存的格式文件里(这里我理解是模型文件),反而是分开保存在一个叫checkpoint的检查点文件里,当初始化时,再通过模型文件里的变量Op节点来从checkoupoint文件读取数据并初始化变量。这种模型和权重数据分开保存的情况,使得发布产品时不是那么方便,所以便有了freeze_graph.py脚本文件用来将这两文件整合合并成一个文件。
freeze_graph.py是怎么做的呢?首行它先加载模型文件,再从checkpoint文件读取权重数据初始化到模型里的权重变量,再将权重变量转换成权重 常量 (因为 常量 能随模型一起保存在同一个文件里),然后再通过指定的输出节点将没用于输出推理的Op节点从图中剥离掉,再重新保存到指定的文件里(用write_graphdef或Saver)

文件目录:tensorflow/python/tools/free_graph.py
测试文件:tensorflow/python/tools/free_graph_test.py 这个测试文件很有学习价值

参数:

总共有11个参数,一个个介绍下(必选: 表示必须有值;可选: 表示可以为空):
1、input_graph:(必选)模型文件,可以是二进制的pb文件,或文本的meta文件,用input_binary来指定区分(见下面说明)
2、input_saver:(可选)Saver解析器。保存模型和权限时,Saver也可以自身序列化保存,以便在加载时应用合适的版本。主要用于版本不兼容时使用。可以为空,为空时用当前版本的Saver。
3、input_binary:(可选)配合input_graph用,为true时,input_graph为二进制,为false时,input_graph为文件。默认False
4、input_checkpoint:(必选)检查点数据文件。训练时,给Saver用于保存权重、偏置等变量值。这时用于模型恢复变量值。
5、output_node_names:(必选)输出节点的名字,有多个时用逗号分开。用于指定输出节点,将没有在输出线上的其它节点剔除。
6、restore_op_name:(可选)从模型恢复节点的名字。升级版中已弃用。默认:save/restore_all
7、filename_tensor_name:(可选)已弃用。默认:save/Const:0
8、output_graph:(必选)用来保存整合后的模型输出文件。
9、clear_devices:(可选),默认True。指定是否清除训练时节点指定的运算设备(如cpu、gpu、tpu。cpu是默认)
10、initializer_nodes:(可选)默认空。权限加载后,可通过此参数来指定需要初始化的节点,用逗号分隔多个节点名字。
11、variable_names_blacklist:(可先)默认空。变量黑名单,用于指定不用恢复值的变量,用逗号分隔多个变量名字。

用法:

例:python tensorflow/python/tools/free_graph.py \
?input_graph=some_graph_def.pb \ 注意:这里的pb文件是用tf.train.write_graph方法保存的
?input_checkpoint=model.ckpt.1001 \ 注意:这里若是r12以上的版本,只需给.data-00000….前面的文件名,如:model.ckpt.1001.data-00000-of-00001,只需写model.ckpt.1001
?output_graph=/tmp/frozen_graph.pb
?output_node_names=softmax

另外,如果模型文件是.meta格式的,也就是说用saver.Save方法和checkpoint一起生成的元模型文件,free_graph.py不适用,但可以改造下:
1、copy free_graph.py为free_graph_meta.py
2、修改free_graph.py,导入meta_graph:from tensorflow.python.framework import meta_graph
3、将91行到97行换成:input_graph_def = meta_graph.read_meta_graph_file(input_graph).graph_def

这样改即可加载meta文件

到此这篇关于tensorflow使用freeze_graph.py将ckpt转为pb文件的方法的文章就介绍到这了,更多相关tensorflow ckpt转为pb文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
python九九乘法表的实例
Sep 26 Python
python3爬取淘宝信息代码分析
Feb 10 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
selenium python 实现基本自动化测试的示例代码
Feb 25 Python
TensorFlow打印输出tensor的值
Apr 19 Python
python 追踪except信息方式
Apr 25 Python
使用Python解析Chrome浏览器书签的示例
Nov 13 Python
python tkinter Entry控件的焦点移动操作
May 22 Python
教你怎么用Python操作MySql数据库
May 31 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 #Python
jupyter lab文件导出/下载方式
Apr 22 #Python
python模拟实现分发扑克牌
Apr 22 #Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 #Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
Apr 22 #Python
python模拟斗地主发牌
Apr 22 #Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
Apr 22 #Python
You might like
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
php实现window平台的checkdnsrr函数
2015/05/27 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
Use Word to Search for Files
2007/06/15 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
Python中Django 后台自定义表单控件
2017/03/28 Python
Python面向对象之继承代码详解
2018/01/29 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
使用python3构建文件传输的方法
2019/02/13 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
安装python及pycharm的教程图解
2019/10/10 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
班长竞选演讲稿
2014/04/24 职场文书
实习推荐信
2014/05/10 职场文书
数学教育专业求职信
2014/07/22 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
2014年幼师工作总结
2014/11/22 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS