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常见文件操作的函数示例代码
Nov 15 Python
python中类变量与成员变量的使用注意点总结
Apr 29 Python
Django 如何获取前端发送的头文件详解(推荐)
Aug 15 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
python3调用百度翻译API实现实时翻译
Aug 16 Python
opencv python 图像去噪的实现方法
Aug 31 Python
python后端接收前端回传的文件方法
Jan 02 Python
selenium2.0中常用的python函数汇总
Aug 05 Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
基于Django实现日志记录报错信息
Dec 17 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 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
日本十大惊悚动漫
2020/03/04 日漫
PHP 时间转换Unix时间戳代码
2010/01/22 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
JQuery 遮罩层实现(mask)实现代码
2010/01/09 Javascript
IE无法设置短域名下Cookie
2010/09/23 Javascript
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
js实现登录与注册界面
2017/11/01 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
python将字典内容存入mysql实例代码
2018/01/18 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
微信小程序python用户认证的实现
2019/07/29 Python
python绘制封闭多边形教程
2020/02/18 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
《手指教学》反思
2014/02/14 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
家长通知书家长意见
2015/06/03 职场文书
雷锋之歌观后感
2015/06/10 职场文书
素质拓展训练感想
2015/08/07 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书