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的Django框架使用的一些实用建议
Apr 03 Python
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
python调用fortran模块
Apr 08 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
Django csrf 两种方法设置form的实例
Feb 03 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
Dec 05 Python
python如何变换环境
Jul 21 Python
浅析Python 多行匹配模式
Jul 24 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 Python
python实战之一步一步教你绘制小猪佩奇
Apr 22 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
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
php flush类输出缓冲剖析
2008/10/19 PHP
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
理解Javascript闭包
2013/11/01 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
node.js中watch机制详解
2014/11/17 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
js实现导航跟随效果
2018/11/17 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
用python实现百度翻译的示例代码
2018/03/09 Python
基于Python的PIL库学习详解
2019/05/10 Python
python实现简单俄罗斯方块
2020/03/13 Python
pygame实现弹球游戏
2020/04/14 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
Hotels.com印度:酒店预订
2019/05/11 全球购物
生产部主管岗位职责
2014/01/06 职场文书
办加油卡单位介绍信
2014/01/09 职场文书
大课间活动制度
2014/01/18 职场文书
妈妈活动方案
2014/08/15 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
Nginx实现会话保持的两种方式
2022/03/18 Servers