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赋值操作方法分享
Mar 23 Python
python获取目录下所有文件的方法
Jun 01 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
Python实现的各种常见分布算法示例
Dec 13 Python
对python3标准库httpclient的使用详解
Dec 18 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
Python实现CAN报文转换工具教程
May 05 Python
Python 如何测试文件是否存在
Jul 31 Python
详解python tcp编程
Aug 24 Python
python实现学生信息管理系统源码
Feb 22 Python
使用python创建股票的时间序列可视化分析
Mar 03 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 && 逻辑与运算符使用说明
2010/03/04 PHP
php字符串截取的简单方法
2013/07/04 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
Javascript里使用Dom操作Xml
2006/09/20 Javascript
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
微信小程序webview实现长按点击识别二维码功能示例
2019/01/24 Javascript
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
Python实现识别手写数字大纲
2018/01/29 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
pytorch 求网络模型参数实例
2019/12/30 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
理财学专业自荐书
2014/06/28 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
物业工程部岗位职责
2015/02/11 职场文书
小学语文教学反思范文
2016/03/03 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书