tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例


Posted in Python onJune 22, 2020

升级到tf 2.0后, 训练的模型想转成1.x版本的.pb模型, 但之前提供的通过ckpt转pb模型的方法都不可用(因为保存的ckpt不再有.meta)文件, 尝试了好久, 终于找到了一个方法可以迂回转到1.x版本的pb模型.

Note: 本方法首先有些要求需要满足:

可以拿的到模型的网络结构定义源码

网络结构里面的所有操作都是通过tf.keras完成的, 不能出现类似tf.nn 的tensorflow自己的操作符

tf2.0下保存的模型是.h5格式的,并且仅保存了weights, 即通过model.save_weights保存的模型.

在tf1.x的环境下, 将tf2.0保存的weights转为pb模型:

如果在tf2.0下保存的模型符合上述的三个定义, 那么这个.h5文件在1.x环境下其实是可以直接用的, 因为都是通过tf.keras高级封装了,2.0版本和1.x版本不存在特别大的区别,我自己的模型是可以直接用的.

import tensorflow as tf
import os
from nets.efficientNet import *
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
# 这个代码网上说需要加上, 如果模型里有dropout , bn层的话, 我测试过加不加结果都一样, 保险起见还是加上吧
tf.keras.backend.set_learning_phase(0)

# 首先是定义你的模型, 这个需要和tf2.0下一毛一样
inputs = tf.keras.Input(shape=(224, 224, 3), name='modelInput')
outputs = yourModel(inputs, training=False)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
model.load_weights('save_weights.h5')
def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True):
  """
  Freezes the state of a session into a pruned computation graph.

  Creates a new computation graph where variable nodes are replaced by
  constants taking their current value in the session. The new graph will be
  pruned so subgraphs that are not necessary to compute the requested
  outputs are removed.
  @param session The TensorFlow session to be frozen.
  @param keep_var_names A list of variable names that should not be frozen,
             or None to freeze all the variables in the graph.
  @param output_names Names of the relevant graph outputs.
  @param clear_devices Remove the device directives from the graph for better portability.
  @return The frozen graph definition.
  """
  from tensorflow.python.framework.graph_util import convert_variables_to_constants
  graph = session.graph
  with graph.as_default():
    freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or []))
    output_names = output_names or []
    output_names += [v.op.name for v in tf.global_variables()]
    # Graph -> GraphDef ProtoBuf
    input_graph_def = graph.as_graph_def(add_shapes=True)
    if clear_devices:
      for node in input_graph_def.node:
        node.device = ""
    frozen_graph = convert_variables_to_constants(session, input_graph_def,
                           output_names, freeze_var_names)
    return frozen_graph

frozen_graph = freeze_session(tf.keras.backend.get_session(), output_names=[out.op.name for out in model.outputs])
tf.train.write_graph(frozen_graph, "model", "tf_model.pb", as_text=False)

运行成功后, 会在当前目录下生成一个model文件夹, 里面有生成的tf_model.pb文件, 至此, 我们就完成了将tf2.0下训练的模型转到tf1.x下的pb模型, 这样,就可以用这个pb模型做其它推理或者转tvm ncnn等模型转换工作.

这个转换的重点就是通过keras这个中间商来完成, 所以我们定义的模型就必须要满足这个中间商定义的条件

补充知识:tensorflow2.0降级及如何从别的版本升到2.0

代码实践《tensorflow实战GOOGLE深度学习框架》时,由于本机安装的tensorflow为2.0版本与配套书籍代码1.4的API不兼容,只得将tensorflow降级为1.4.0版本使用,降级方法如下

1 pip uninstall tensorflow

tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例

2 pip install tensorflow==1.14.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例

验证

import tensorflow as tf
print(tf.version)

tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例

二 从别的版本升级到2.0

自动卸载与其相关包

pip uninstall tensorflow

安装某版本

pip install --no-cache-dir tensorflow==x.xx (此处填写2.0)

tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例

验证

tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例

以上这篇tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取从命令行输入数字的方法
Apr 29 Python
python比较两个列表是否相等的方法
Jul 28 Python
详解用python实现简单的遗传算法
Jan 02 Python
python如何让类支持比较运算
Mar 20 Python
python中的变量如何开辟内存
Jun 26 Python
小白入门篇使用Python搭建点击率预估模型
Oct 12 Python
使用Python实现从各个子文件夹中复制指定文件的方法
Oct 25 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
Mar 08 Python
python 数据库查询返回list或tuple实例
May 15 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
利用Vscode进行Python开发环境配置的步骤
Jun 22 #Python
Python Excel vlookup函数实现过程解析
Jun 22 #Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 #Python
python和php哪个更适合写爬虫
Jun 22 #Python
如何理解python对象
Jun 21 #Python
什么是python的必选参数
Jun 21 #Python
什么是python的自省
Jun 21 #Python
You might like
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
checkbox使用示例
2013/08/23 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
微信小程序 LOL 英雄介绍开发实例
2016/09/30 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
jquery实现聊天机器人
2020/02/08 jQuery
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
详解Python中的条件判断语句
2015/05/14 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
Python中格式化format()方法详解
2017/04/01 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
python实现图片转字符画
2021/02/19 Python
酒店秘书求职信范文
2014/02/17 职场文书
理工大学毕业生自荐信范文
2014/02/22 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
2014年校长工作总结
2014/12/11 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL