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学习笔记:字典的使用示例详解
Jun 13 Python
Python自动化构建工具scons使用入门笔记
Mar 10 Python
用Python实现换行符转换的脚本的教程
Apr 16 Python
Python的Django框架中自定义模版标签的示例
Jul 20 Python
Python装饰器基础详解
Mar 09 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 Python
Python单体模式的几种常见实现方法详解
Jul 28 Python
django框架模板语言使用方法详解
Jul 18 Python
使用python代码进行身份证号校验的实现示例
Nov 21 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
python数据抓取3种方法总结
Feb 07 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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
destoon设置自定义搜索的方法
2014/06/21 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
PHP与Web页面的交互示例详解二
2020/08/04 PHP
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
原生JS实现自定义下拉单选选择框功能
2018/10/12 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
python3.x实现发送邮件功能
2018/05/22 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
python 检测图片是否有马赛克
2020/12/01 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
聚美优品恶搞广告词
2014/03/14 职场文书
法学自荐信
2014/06/20 职场文书
个人优缺点总结
2015/02/28 职场文书
运动会口号霸气押韵
2015/12/24 职场文书