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 25 Python
python实现一次创建多级目录的方法
May 15 Python
python中__call__内置函数用法实例
Jun 04 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
Python实现破解猜数游戏算法示例
Sep 25 Python
django rest framework之请求与响应(详解)
Nov 06 Python
对python中数组的del,remove,pop区别详解
Nov 07 Python
python实现简单的单变量线性回归方法
Nov 08 Python
python实现人机猜拳小游戏
Feb 03 Python
tensorflow mnist 数据加载实现并画图效果
Feb 05 Python
python numpy--数组的组合和分割实例
Feb 24 Python
Python中的turtle画箭头,矩形,五角星
Mar 16 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/09/01 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
php通过各种函数判断0和空
2020/07/04 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
jQuery 使用个人心得
2009/02/26 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
jquery异步调用页面后台方法‏(asp.net)
2011/03/01 Javascript
js操作table示例(个人心得)
2013/11/29 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
AngularJS 执行流程详细介绍
2016/08/18 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
vue如何限制只能输入正负数及小数
2019/07/04 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
python中的字典操作及字典函数
2018/01/03 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
初三学生个人自我评定
2014/04/06 职场文书
任命书怎么写
2014/06/04 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
庆元旦演讲稿
2014/09/15 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
校本培训个人总结
2015/02/28 职场文书
毕业设计致谢语
2015/05/14 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript