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中的异常处理
Apr 28 Python
python中range()与xrange()用法分析
Sep 21 Python
Python实现一个转存纯真IP数据库的脚本分享
May 21 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
学生信息管理系统python版
Oct 17 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
基于python 等频分箱qcut问题的解决
Mar 03 Python
Python Django form 组件动态从数据库取choices数据实例
May 19 Python
python如何操作mysql
Aug 17 Python
python 安全地删除列表元素的方法
Mar 16 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 21 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连接函数implode与分割explode的深入解析
2013/06/26 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
python实现的一个p2p文件传输实例
2014/06/04 Python
Python中endswith()函数的基本使用
2015/04/07 Python
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
tensorflow实现softma识别MNIST
2018/03/12 Python
Python实战购物车项目的实现参考
2019/02/20 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
计算机专业大学生的自我评价
2013/11/14 职场文书
建筑工地宣传标语
2014/06/18 职场文书
租赁协议书
2015/01/27 职场文书
幼儿园父亲节活动总结
2015/02/12 职场文书
公司酒会主持词
2015/07/02 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书