1 tensorflow模型固化

1.1 训练时直接固化成pb文件

import tensorflow as tf
from tensorflow.python.framework import graph_utilv1 = tf.Variable(tf.constant(1.0, tf.float32, [1]),name='v1')
v2 = tf.Variable(tf.constant(2.0, tf.float32, [1]),name='v2')
result = v1 + v2with tf.Session() as sess:print(sess.run(tf.global_variables_initializer()))print(result.eval())# 导出当前计算图的GraphDef部分,只需要这一部分就可以完成从输入层到输出层的计算过程graph_def = tf.get_default_graph().as_graph_def()# 将图中的变量及其取值转化为常量,同时将图中不必要的节点去掉(例如一些诸如变量初始化操作的系统运算)# 如果只关心程序中定义的某些运算时,和这些计算无关的节点就没有必要导出并保存了,在下面的一行代码中,# 最后一个参数['add']给出了需要保存的节点名称.add节点是上面定义的两个变量相加的操作.# 注意这里给出的计算节点的名称,所以没有后面的:0,:0表示的是该节点的第一个输出output_graph_def = graph_util.convert_variables_to_constants(sess,graph_def,['add'])# 将导出的模型存入文件with tf.gfile.GFile('./model/combined_model.pb', 'wb') as f:f.write(output_graph_def.SerializeToString())

1.2 已有训练好的ckpt文件固化成pb文件

1.2.1 前期准备
import tensorflow as tfv1 = tf.Variable(tf.constant(1.0,tf.float32, [1]),name='v1')
v2 = tf.Variable(tf.constant(2.0,tf.float32, [1]),name='v2')result = v1 + v2
saver = tf.train.Saver()with tf.Session() as sess:sess.run(tf.global_variables_initializer())print(result.eval())saver.save(sess,'./model/model.ckpt')

模型文件如下

整个模型固化过程分两步进行,首先加载模型并将参数赋予训练得到的值,然后固化模型,写入pb文件。

1.2.2 加载模型和参数

方式一,通过加载meta图结构加载原图, saver = tf.train.import_meta_graph(cpkt_path + ‘.meta’, clear_devices=True)

import tensorflow as tf
from tensorflow.python.framework import graph_utilsaver = tf.train.import_meta_graph('./FAW_VHE_best_model/ckpt.meta')
graph_def = tf.get_default_graph().as_graph_def()with tf.Session() as sess:saver.restore(sess, './FAW_VHE_best_model/ckpt')output_graph_def = graph_util.convert_variables_to_constants(sess,graph_def,['add'])print(sess.run(tf.get_default_graph().get_tensor_by_name('add:0')))  # 3.0with tf.gfile.GFile('./model/model.pb', 'wb') as f:f.write(output_graph_def.SerializeToString())  # 得到文件:model.pb

————————————————
原文链接:https://blog.csdn.net/liugan528/article/details/109482836

方法二 通过重新构建与训练模型一样的图,初始化参数,再读取模型文件将参数赋值给模型参数上

def export_model_test():#测试placeholder能不能在保存pb文件的时候重命名model_path = "./FAW_VHE_best_model/ckpt"tf.reset_default_graph()   #model = Model(user_num, poi_num, p_adj)model.build()# model.u = tf.placeholder(tf.float32, shape=[None], name='u')# model.hist = tf.placeholder(tf.float32, shape=[None, None], name='hist')# model.length = tf.placeholder(tf.float32, shape=[None], name='length')# # max_length = tf.placeholder(tf.float32, shape=[None, 224, 224, 3], name='input')# model.pos = tf.placeholder(tf.float32, shape=[None], name='pos')# model.neg = tf.placeholder(tf.float32, shape=[None], name='neg')# tf.identity(model.neg, "neg")tf.identity(model.u, "u")   # op可以重命名,并且使用,placeholder不能用这种方式重命名,后面加载pb文件看节点的时候看不到placeholder的重命名结果,op可以看到tf.identity(model.hist, "hist")tf.identity(model.length, "length")tf.identity(model.score, "out")saver = tf.train.Saver()with tf.Session() as sess:sess.run(tf.global_variables_initializer())saver.restore(sess, model_path)graph_def = tf.get_default_graph().as_graph_def()output_graph_def = tf.graph_util.convert_variables_to_constants(sess, graph_def, ["out"])with tf.gfile.GFile('./model/model.pb', 'wb') as f:f.write(output_graph_def.SerializeToString())
1.2.3 固化模型写入pb文件

方式一 把变量转成常量之后写入PB文件中

output_graph_def = graph_util.convert_variables_to_constants(sess,graph_def,['add'])
# 将导出的模型存入文件
with tf.gfile.GFile('./model/model.pb', 'wb') as f:f.write(output_graph_def.SerializeToString())

方式二 通过freeze_graph把tf.train.write_graph()生成的pb文件与tf.train.saver()生成的chkp文件固化之后重新生成一个pb文件,这一种现在不太建议使用

import tensorflow as tf
from tensorflow.python.tools import freeze_graph # network是你自己定义的模型
import network# 模型的checkpoint文件地址
ckpt_path = "./FAW_VHE_best_model/ckpt"def main(): tf.reset_default_graph() x = tf.placeholder(tf.float32, shape=[None, 224, 224, 3], name='input')# flow是模型的输出flow = network(x)#设置输出类型以及输出的接口名字,为了之后的调用pb的时候使用 flow = tf.cast(flow, tf.int8, 'out')with tf.Session() as sess:#保存图,在./pb_model文件夹中生成model.pb文件# model.pb文件将作为input_graph给到接下来的freeze_graph函数tf.train.write_graph(sess.graph_def, './pb_model', 'model.pb') #把图和参数结构一起 freeze_graph.freeze_graph(input_graph='./model/model.pb',input_saver='',input_binary=False, input_checkpoint=ckpt_path, output_node_names='out',restore_op_name='save/restore_all',filename_tensor_name='save/Const:0',output_graph='./pb_model/frozen_model.pb',clear_devices=False,initializer_nodes='')print("done") if __name__ == '__main__': main()

方式

2 读取pb文件

2.1 重新定义placeholder,并通过input_map链接的方式

import tensorflow as tf
from tensorflow.python.platform import gfilev1_ph = tf.placeholder(tf.float32,name='v1_ph')
v2_ph = tf.placeholder(tf.float32,name='v2_ph')with tf.Session() as sess:model_filename = './model/model.pb'# 读取保存的模型文件,并将文件解析成对应的GraphDef Protobuf Bufferwith gfile.FastGFile(model_filename,'rb') as f:graph_def = tf.GraphDef()graph_def.ParseFromString(f.read())# 查看计算图上有哪些节点,用于确定网络的输入输出节点名node_names_list = [tensor.name for tensor in graph_def.node]for node_name in node_names_list:print(node_name)# 将graph_def中保存的图加载到当前的图中,return_elements=['add:0']给出了返回的张量名称# 在保存的时候给出的是计算节点的名称,所以为'add',在加载的时候给出的是张量的名称,所以是'add:0'result = tf.import_graph_def(graph_def, input_map={'v1:0':v1_ph, 'v2:0':v2_ph}, return_elements=['add:0'])print(sess.run(result, feed_dict={v1_ph:177, v2_ph:12}))  # 输出189.0

————————————————
原文链接:https://blog.csdn.net/liugan528/article/details/109482836

2.2 placeholder重新定义,直接通过return_elements返回的方式

import tensorflow as tf
from tensorflow.python.platform import gfile
with tf.Session() as sess:model_filename = './model/combined_model.pb'# 读取保存的模型文件,并将文件解析成对应的GraphDef Protobuf Bufferwith gfile.FastGFile(model_filename,'rb') as f:graph_def = tf.GraphDef()graph_def.ParseFromString(f.read())# 将graph_def中保存的图加载到当前的图中,return_elements=['add:0']给出了返回的张量名称# 在保存的时候给出的是计算节点的名称,所以为'add',在加载的时候给出的是张量的名称,所以是'add:0'v1_ph,v2_ph,result = tf.import_graph_def(graph_def, return_elements=['v1:0', 'v2:0','add:0'])print(sess.run(result, feed_dict={v1_ph:177, v2_ph:12}))  # 输出189.0

其他tensorflow有用函数

import tensorflow as tf
from tensorflow.python.framework import graph_util
from tensorflow.python import pywrap_tensorflowdef freeze_graph(cpkt_path, pb_path):# checkpoint = tf.train.get_checkpoint_state('zhou/') #检查目录下ckpt文件状态是否可用# cpkt_path2 = checkpoint.model_checkpoint_path #得ckpt文件路径# cpkt_path3 = checkpoint.all_model_checkpoint_paths# print("model_pa:",cpkt_path3)# 指定输出的节点名称,该节点名称必须是原模型中存在的节点# output_node_names = "num_detections,raw_detection_boxes,raw_detection_scores"output_node_names = 'logistic_loss/mul'saver = tf.train.import_meta_graph(cpkt_path + '.meta', clear_devices=True)graph = tf.get_default_graph()input_graph_def = graph.as_graph_def()print(graph)# feature_data_list = input_graph_def.get_operation_by_name('resnet_v2_50/conv1').outputs[0]# input_image=tf.placeholder(None,28,28,1)with tf.Session() as sess:saver.restore(sess, cpkt_path)  # 恢复图并得到数据pb_path_def = graph_util.convert_variables_to_constants(  # 模型持久化,将变量值固定sess=sess,input_graph_def=input_graph_def,  # 等于:sess.graph_defoutput_node_names=output_node_names.split(","))  # 如果有多个输出节点,以逗号隔开# print(pb_path_def)with tf.gfile.GFile(pb_path, 'wb') as fgraph:fgraph.write(pb_path_def.SerializeToString())

tensorflow模型固化相关推荐

  1. tensorboard ckpt pb 模型的输出节点_算法工程化系列——模型固化

    摘要 基于tensorflow训练的模型一般被保存为ckpt形式的文件,随着当前深度学习模型网络越来越大,对应模型也会非常大.当对外提供服务的时候,如果采用ckpt的形式,服务进程被调起来非常困难,且 ...

  2. 将TensorFlow模型快速迁移到昇腾平台

    当前业界很多训练脚本是基于TensorFlow的Python API进行开发的,默认运行在CPU/GPU/TPU上,为了使这些脚本能够利用昇腾AI处理器的强大算力执行训练,需要对TensorFlow的 ...

  3. 干货 | tensorflow模型导出与OpenCV DNN中使用

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|OpenCV学堂 OpenCV DNN模块 Deep N ...

  4. keras添加正则化全连接_收藏!改善TensorFlow模型的4种方法你需要了解的关键正则化技术(2)...

    上一篇文章和同学们分享了两种方法,今天我们继续分享另外两种方法. Batch Normalization 批处理规范化背后的主要思想是,在我们的案例中,我们通过使用几种技术(sklearn.prepr ...

  5. 简单完整地讲解tensorflow模型的保存和恢复

    http://blog.csdn.net/liangyihuai/article/details/78515913 在本教程主要讲到: 1. 什么是Tensorflow模型? 2. 如何保存Tenso ...

  6. 打成jar包_keras, tensorflow模型部署通过jar包部署到spark环境攻略

    这是个我想干很久的事情了.之前研究tensorflow on spark, DL4j 都没有成功.所以这里首先讲一下我做这件事情的流程.模型的部署,首先你得有一个模型.这里假设你有了一个keras模型 ...

  7. TensorFlow模型的签名推荐与快速上线\n

    简介 往期文章 我们给你推荐一种TensorFlow模型格式 介绍过, TensorFlow官方推荐SavedModel格式作为在线服务的模型文件格式.近期TensorFlow SavedModel模 ...

  8. Tensorflow【实战Google深度学习框架】TensorFlow模型的保存与恢复加载

    我们使用TensorFlow进行模型的训练,训练好的模型需要保存,预测阶段我们需要将模型进行加载还原使用,这就涉及TensorFlow模型的保存与恢复加载. 总结一下Tensorflow常用的模型保存 ...

  9. 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介...

    平时工作就是做深度学习,但是深度学习没有落地就是比较虚,目前在移动端或嵌入式端应用的比较实际,也了解到目前主要有 caffe2,腾讯ncnn,tensorflow,因为工作用tensorflow比较多 ...

最新文章

  1. python不断刷新网页_python多线程不断刷新网页的代码
  2. 被鹤岗买房鼓励,我带上6万来到另一小城
  3. java吵醒线程_一文搞懂 Java 线程中断
  4. 发现华为才是真·手机公司,小米确实不靠卖手机赚钱...
  5. TensorRT学习笔记6 - IPlugin
  6. 推荐几个图标显示控件
  7. SAP Fiori里两种锁机制(lock)的实现
  8. linux中ftp的工作原理,Linux系统学习 十二、VSFTP服务—简介与原理
  9. 大四阶段的社会实践的主要目的是_大四寒假社会实践报告1500字范文
  10. 如何用一行 CSS 实现 10 种现代布局?
  11. java 两个项目 生成唯一id_java方式生成唯一id
  12. 如何测试前台获得的数据
  13. SHFileOperation
  14. HMI车载开发:汽车与Android的关系:Android Automotive
  15. 微信公众号开发之课堂考勤
  16. 关于2022虎符pwn mva解决jmp rax无法反汇编的这么个事情
  17. Android删除系统的WIFI功能
  18. 手机显示器云服务器,不想买台式机,手机加显示器组成云电脑是否可行?
  19. 星起航跨境—亚马逊发展现状及未来趋势分析
  20. [Numpy]stack(), hstack(), vstack(), concatenate()

热门文章

  1. 位置式PID与增量式PID——理论推导
  2. DUC的matlab仿真
  3. C语言求最大公约数最小公倍数
  4. 重装服务器显示bootmgr缺失怎么办,U盘装系统后提示bootmgr is missing解决方案
  5. 程序员导航网域名升级了
  6. 泛微E9二次开发,用计划任务定时发送邮件提醒
  7. linux服务器开放指定端口号相关命令
  8. 58笔试-2018秋招
  9. NumPy最详细入门笔记
  10. hc05刷hid固件_HC05蓝牙模块 蓝牙HC05双模模块 管脚相同