TensorFlow固化模型的实现操作


Posted in Python onMay 26, 2020

前言

TensorFlow目前在移动端是无法training的,只能跑已经训练好的模型,但一般的保存方式只有单一保存参数或者graph的,如何将参数、graph同时保存呢?

生成模型

主要有两种方法生成模型,一种是通过freeze_graph把tf.train.write_graph()生成的pb文件与tf.train.saver()生成的chkp文件固化之后重新生成一个pb文件,这一种现在不太建议使用。另一种是把变量转成常量之后写入PB文件中。我们简单的介绍下freeze_graph方法。

freeze_graph

这种方法我们需要先使用tf.train.write_graph()以及tf.train.saver()生成pb文件和ckpt文件,代码如下:

with tf.Session() as sess:
 saver = tf.train.Saver()
 saver.save(session, "model.ckpt")
 tf.train.write_graph(session.graph_def, '', 'graph.pb')

然后使用TensorFlow源码中的freeze_graph工具进行固化操作:

首先需要build freeze_graph 工具( 需要 bazel ):

bazel build tensorflow/python/tools:freeze_graph

然后使用这个工具进行固化(/path/to/表示文件路径):

bazel-bin/tensorflow/python/tools/freeze_graph --input_graph=/path/to/graph.pb --input_checkpoint=/path/to/model.ckpt --output_node_names=output/predict --output_graph=/path/to/frozen.pb
convert_variables_to_constants

其实在TensorFlow中传统的保存模型方式是保存常量以及graph的,而我们的权重主要是变量,如果我们把训练好的权重变成常量之后再保存成PB文件,这样确实可以保存权重,就是方法有点繁琐,需要一个一个调用eval方法获取值之后赋值,再构建一个graph,把W和b赋值给新的graph。

牛逼的Google为了方便大家使用,编写了一个方法供我们快速的转换并保存。

首先我们需要引入这个方法

from tensorflow.python.framework.graph_util import convert_variables_to_constants

在想要保存的地方加入如下代码,把变量转换成常量

output_graph_def = convert_variables_to_constants(sess, sess.graph_def, output_node_names=['output/predict'])

这里参数第一个是当前的session,第二个为graph,第三个是输出节点名(如我的输出层代码是这样的:)

with tf.name_scope('output'):
 w_out = tf.Variable(w_alpha * tf.random_normal([1024, MAX_CAPTCHA * CHAR_SET_LEN]))
 tf.summary.histogram('output/weight', w_out)
 b_out = tf.Variable(b_alpha * tf.random_normal([MAX_CAPTCHA * CHAR_SET_LEN]))
 tf.summary.histogram('output/biases', b_out)
 out = tf.add(tf.matmul(dense2, w_out), b_out)
 out = tf.nn.softmax(out)
 predict = tf.argmax(tf.reshape(out, [-1, 11, 36]), 2, name='predict')

由于我们采用了name_scope所以我们在predict之前需要加上output/

生成文件

with tf.gfile.FastGFile('model/CTNModel.pb', mode='wb') as f:
f.write(output_graph_def.SerializeToString())

第一个参数是文件路径,第二个是指文件操作的模式,这里指的是以二进制的方式写入文件。

运行代码,系统会生成一个PB文件,接下来我们要测试下这个模型是否能够正常的读取、运行。

测试模型

在Python环境下,我们首先需要加载这个模型,代码如下:

with open('./model/rounded_graph.pb', 'rb') as f:
 graph_def = tf.GraphDef()
 graph_def.ParseFromString(f.read())
 output = tf.import_graph_def(graph_def,
     input_map={'inputs/X:0': newInput_X},
     return_elements=['output/predict:0'])

由于我们原本的网络输入值是一个placeholder,这里为了方便输入我们也先定义一个新的placeholder:

newInput_X = tf.placeholder(tf.float32, [None, IMAGE_HEIGHT * IMAGE_WIDTH], name="X")

在input_map的参数填入新的placeholder。

在调用我们的网络的时候直接用这个新的placeholder接收数据,如:

text_list = sesss.run(output, feed_dict={newInput_X: [captcha_image]})

然后就是运行我们的网络,看是否可以运行吧。

以上这篇TensorFlow固化模型的实现操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 第一步 hello world
Sep 25 Python
python中关于日期时间处理的问答集锦
Mar 08 Python
python进阶教程之循环对象
Aug 30 Python
python爬取NUS-WIDE数据库图片
Oct 05 Python
对python中return和print的一些理解
Aug 18 Python
python 接口_从协议到抽象基类详解
Aug 24 Python
python tornado微信开发入门代码
Aug 24 Python
如何在Python中实现goto语句的方法
May 18 Python
python顺序执行多个py文件的方法
Jun 29 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
Python设计密码强度校验程序
Jul 30 Python
python 决策树算法的实现
Oct 09 Python
Python 如何批量更新已安装的库
May 26 #Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 #Python
Python自定义聚合函数merge与transform区别详解
May 26 #Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
May 26 #Python
tensorflow实现从.ckpt文件中读取任意变量
May 26 #Python
打印tensorflow恢复模型中所有变量与操作节点方式
May 26 #Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
May 26 #Python
You might like
PHP调用三种数据库的方法(1)
2006/10/09 PHP
PHP的面试题集
2006/11/19 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
php格式化json函数示例代码
2016/05/12 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
2018/10/24 jQuery
layDate日期控件使用方法详解
2018/11/15 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
vue 中的 render 函数作用详解
2020/02/28 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
详解java调用python的几种用法(看这篇就够了)
2020/12/10 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
自考生自我评价分享
2014/01/18 职场文书
担保书格式及范文
2014/04/01 职场文书
表彰大会策划方案
2014/05/13 职场文书
会计电算化专业求职信
2014/06/10 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书
教师读书活动心得体会
2016/01/14 职场文书