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 01 Python
python使用marshal模块序列化实例
Sep 25 Python
使用graphics.py实现2048小游戏
Mar 10 Python
python使用datetime模块计算各种时间间隔的方法
Mar 24 Python
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
python制作爬虫并将抓取结果保存到excel中
Apr 06 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
python3爬取各类天气信息
Feb 24 Python
完美解决在oj中Python的循环输入问题
Jun 25 Python
Python操作SQLite数据库过程解析
Sep 02 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
使用Python实现分别输出每个数组
Dec 06 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
php批量删除cookie的简单实现方法
2015/01/26 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
js控制框架刷新
2008/08/01 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
Python 查看list中是否含有某元素的方法
2018/06/27 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
详解px单位html5响应式方案
2018/03/08 HTML / CSS
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
小学教研工作总结2015
2015/05/13 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL