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 18 Python
python字符串的常用操作方法小结
May 21 Python
python 写入csv乱码问题解决方法
Oct 23 Python
Python进程间通信之共享内存详解
Oct 30 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
python实现浪漫的烟花秀
Jan 30 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
pandas 数据结构之Series的使用方法
Jun 21 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
Python判断三段线能否构成三角形的代码
Apr 12 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 Python
python面向对象版学生信息管理系统
Jun 24 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下网站防IP攻击代码,超级实用
2010/10/24 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
jQuery - css() 方法示例详解
2014/01/16 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
2016/11/29 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
vue实现局部刷新的实现示例
2019/04/16 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
通过C++学习Python
2015/01/20 Python
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
公司活动邀请函
2014/01/24 职场文书
社区春季防火方案
2014/06/02 职场文书
个性车贴标语
2014/06/24 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
汉语拼音教学反思
2016/02/22 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书