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常用内置函数总结
Feb 08 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
python面向对象_详谈类的继承与方法的重载
Jun 07 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
python快排算法详解
Mar 04 Python
Python3中_(下划线)和__(双下划线)的用途和区别
Apr 26 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
深入理解Tensorflow中的masking和padding
Feb 24 Python
Python多线程通信queue队列用法实例分析
Mar 24 Python
pycharm 实现调试窗口恢复
Feb 05 Python
浅谈python中的多态
Jun 15 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
分享下php5类中三种数据类型的区别
2015/01/26 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
php数组指针函数功能及用法示例
2020/02/11 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
28个JS验证函数收集
2010/03/02 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
python正则中最短匹配实现代码
2018/01/16 Python
Python Flask基础教程示例代码
2018/02/07 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
python+pyqt5编写md5生成器
2019/03/18 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
旧时光糖果:Old Time Candy
2018/02/05 全球购物
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
舞蹈教育学专业推荐信
2013/11/27 职场文书
办公室内勤工作职责
2013/12/11 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
2014村务公开实施方案
2014/02/25 职场文书
安全生产承诺书
2014/03/26 职场文书
员工合理化建议书
2014/05/19 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
MySQL主从切换的超详细步骤
2022/06/28 MySQL