ckpt模型转换为tf serving的saved model格式
最近这段时间又开始在弄部署问题,使用的是Google的Tensorflow serving框架,使用的环境是Ubuntu16.0.4+docker+tensorflow serving。如果需要知道这个框架搭建及使用,可以看我之前的博客,环境搭建、模型部署测试、模型部署时的GPU设置、多模型在线部署。很久之后再弄,TF Serving的简单使用还是没有问题的,根据我之前的博客就可以做到模型的部署和服务申请以及多模型部署和测试。之前都是学习,所以都是简单的模型进行部署和简单的测试,在实际部署时会有很多问题。首先,在将训练好的模型转换为saved model的时候就会出现很多问题。这里主要讨论将TensorFlow的ckpt格式模型转换为saved model的时候出现的问题。
训练时保存为saved model格式
我们常说将TensorFlow模型格式转换为saved model格式,其实在TensorFlow 训练时就可以将其保存为saved model格式。
# 模型输入输出以及模型定义
x = tf.placeholder(dtype = tf.float32, shape = [None,224,224,3], name = 'input_image')
model =VGG16().build_vgg16(x,N_CLASSES) # 用tf.layers实现的vgg网络
# model输出为softmax概率
'''
模型训练...
'''
tf.saved_model.simple_save(sess,"./saved_models/model_"+str(step),inputs={"MyInput": x},outputs={"MyOutput": model})#复杂形式
builder = tf.saved_model.builder.SavedModelBuilder("./saved_models1/model_"+str(step))signature = predict_signature_def(inputs={'myInput': x},outputs={'myOutput': model})
builder.add_meta_graph_and_variables(sess=sess,tags=[tf.saved_model.tag_constants.SERVING],signature_def_map={'predict': signature})
builder.save()
"./saved_models/model_"+str(step) 是模型保存的位置,“MyInput”是保存的模型中x的名称,x是模型的输入,例如输入图像,model是网络的输出,例如softmax分类概率。
将ckpt格式转换为saved model格式
有时候,并没有在训练后将模型保存为saved model格式,重新训练又比较麻烦,需要将模型转换为saved model格式。其实质和训练时保存模型是一样的,需要在会话中恢复网络并加载参数到网络中,然后保存即可。
def restore_and_save(checkpoint_file, export_path):''':param: checkpoint_file: 模型保存时的路径+模型名前缀:param: export_path: 转换后的模型的路径'''graph = tf.Graph()with graph.as_default():session_conf = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)sess = tf.Session(config=session_conf)with sess.as_default():# 载入保存好的meta graph,恢复图中变量,通过SavedModelBuilder保存可部署的模型saver = tf.train.import_meta_graph(checkpoint_file+'.meta')saver.restore(sess, checkpoint_file)print(graph.get_name_scope())tf.summary.FileWriter(logs_dir, sess.graph)# 去除多余枝节converted_graph_def = tf.graph_util.convert_variables_to_constants(sess, graph.as_graph_def(), ['output'])g = tf.graph_util.extract_sub_graph(converted_graph_def, ['output'])g = tf.graph_util.remove_training_nodes(g, protected_nodes=["input_x", "output"])builder = tf.saved_model.builder.SavedModelBuilder(export_path)"""build_tensor_info建立一个基于提供的参数构造的TensorInfo protocol buffer,输入:tensorflow graph中的tensor;输出:基于提供的参数(tensor)构建的包含TensorInfo的protocol bufferget_operation_by_name通过name获取checkpoint中保存的变量,能够进行这一步的前提是在模型保存的时候给对应的变量赋予name"""print(graph.get_operation_by_name("input_x").outputs[0].shape)input_image = tf.saved_model.utils.build_tensor_info(graph.get_operation_by_name("input_x").outputs[0])print(graph.get_operation_by_name("output").outputs[0].shape)output = tf.saved_model.utils.build_tensor_info(graph.get_operation_by_name("output").outputs[0])"""signature_constantsSavedModel保存和恢复操作的签名常量。在序列标注的任务中,这里的method_name是"tensorflow/serving/predict""""# 定义模型的输入输出,建立调用接口与tensor签名之间的映射labeling_signature = (tf.saved_model.signature_def_utils.build_signature_def(inputs={"input_image": input_image,},outputs={"output": output},method_name="tensorflow/serving/predict"))"""add_meta_graph_and_variables建立一个Saver来保存session中的变量,输出对应的原图的定义,这个函数假设保存的变量已经被初始化;对于一个SavedModelBuilder,这个API必须被调用一次来保存meta graph;对于后面添加的图结构,可以使用函数 add_meta_graph()来进行添加"""# 建立模型名称与模型签名之间的映射builder.add_meta_graph_and_variables(sess, [tf.saved_model.tag_constants.SERVING],# 保存模型的方法名,与客户端的request.model_spec.signature_name对应signature_def_map={tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:labeling_signature})builder.save()print("Build Done")
注释:
1. 代码中“input_x”是ckpt模型中输入节点的名称,output是输出节点的名称。有时候我们得到一个模型这些信息不一定能完全知道,那么这个模型能够用么?绝对可以。可以通过 代码中的这行: tf.summary.FileWriter(logs_dir, sess.graph)将模型信息保存在logs路径下,通过Tensorboard查看模型信息,模型各个节点名城,shape等。然后再往下进行转换。
2. 代码中有几行是对模型的剪枝,这行看起来不是很重要,但是我在实际部署时,由于同事在训练时,将模型的输出也保存为占位符并保存在模型中,转换模型时没有任何问题,但是当我使用时,我必须要对这个输入进行传参才能够得到输入,服务申请报错是:该占位符没有传参,所以我使用了以上剪枝,然后就没有任何问题了。
如果该博客对你有用,点个赞(*—*)
ckpt模型转换为tf serving的saved model格式相关推荐
- TF之TFOD-API:基于tensorflow框架利用TFOD-API脚本文件将YoloV3训练好的.ckpt模型文件转换为推理时采用的.pb文件
TF之TFOD-API:基于tensorflow框架利用TFOD-API脚本文件将YoloV3训练好的.ckpt模型文件转换为推理时采用的frozen_inference_graph.pb文件 目录 ...
- 【Pytorch基础教程33】算法模型部署(MLFlow/ONNX/tf serving)
内容概况 服务器上训练好模型后,需要将模型部署到线上,接受请求.完成推理并且返回结果. 保存模型结构和参数最简单的是torch.save保存为checkpoint,但一般用于训练时记录过程,训练中断可 ...
- caffe安装_keras/tensorflow1.x模型转换为caffe推理模型
前言 在工业界混的人,每个人都有自己习惯的框架,有时为了部署不得不在框架之间进行模型转换.踩了几个坑之后,终于转换成功,这里记录一下分享一下.gayhub链接: xggIoU/tensorflow_k ...
- as转html5工具,将keras的h5模型转换为tensorflow的pb模型
背景:目前keras框架使用简单,很容易上手,深得广大算法工程师的喜爱,但是当部署到客户端时,可能会出现各种各样的bug,甚至不支持使用keras,本文来解决的是将keras的h5模型转换为客户端常用 ...
- tensorflow框架.ckpt .pb模型节点tensor_name打印及ckpt模型转.pb模型
转换模型首先要知道的是从哪个节点输出,如果没有源代码是很难清楚节点信息. 获取ckpt模型的节点名称 import os from tensorflow.python import pywrap_te ...
- 加载模型图_Tensorflow ckpt模型加载时的命名映射
tensorflow代码在加载ckpt模型时一般会使用如下代码: saver = tf.train.Saver() with tf.Session() as sess:saver.restore(se ...
- IPU Saved Model Tool -- User Guide
[前言] IPU Saved Model Tool是一款用于处理saved_model.pb模型的工具,用户可以借助此工具预览模型信息,转换模型,推理模型,以及对比CPU与IPU模型结果.本手册具体介 ...
- Tensorflow基于pb模型进行预训练(pb模型转CKPT模型)
Tensorflow基于pb模型进行预训练(pb模型转CKPT模型) 在网上看到很多教程都是tensorflow基于pb模型进行推理,而不是进行预训练.最近在在做项目的过程中发现之前的大哥只有一个pb ...
- ai css 线条粗细_如何训练AI将您的设计模型转换为HTML和CSS
ai css 线条粗细 by Emil Wallner 埃米尔·沃尔纳(Emil Wallner) 如何训练AI将您的设计模型转换为HTML和CSS (How you can train an AI ...
- 将ONNX对象检测模型转换为iOS Core ML(一)
目录 介绍 使用YOLO进行物体检测 寻找正确的模型 将ONNX转换为Core ML 下一步 总目录 将ONNX对象检测模型转换为iOS Core ML(一) 解码Core ML YOLO对象检测器( ...
最新文章
- “在使用GCC时,同意Xcode / iOS许可证需要管理员权限,请通过sudo以root身份重新运行。”
- python开发系统-python3+django2开发一个简单的人员管理系统
- 复旦大学邱锡鹏教授团队:Transformer最新综述
- docker容器运行mysql持久化_OS x下使用Docker 持久化Mysql 数据出现问题
- framebuffer驱动详解2——framebuffer驱动框架分析
- Solr7.2.1环境搭建和配置ik中文分词器
- 《MFC游戏开发》笔记九 游戏中的碰撞判定初步怪物运动简单AI
- Duplicate Photos Fixer Pro for Mac用户指南:我可以比较不同时间的照片吗?
- 在Spring Security框架下JWT的实现细节原理
- 超级记事本android,基于Android的超级记事本APP设计.doc
- 【Junit Experiment】Junit 软件质量测试实验--日期格式规范性+字符串格式规范性
- 测试用例的评审和变更
- 计算机系单身率排行榜,2020中国高校单身率排行榜出炉!附:单身率特别高的专业...
- Java Object类讲解 上帝类及其一些方法的分析
- 施密特正交化过程编程c语言,利用C程序编写格拉姆-施密特正交化的过程.docx
- mac安装win10后触摸板没有右键功能键的添加技巧
- 微信支付(公众号支付)微信公众平台开发教程(5)
- mysql中locat函数,MySQL中的LOCATE和POSITION函数使用方法
- opencv 轮廓放大_使用OpenCV和Python构建自己的车辆检测模型
- 简单的java单位换算_Java实现蓝桥杯单位转换
热门文章
- python中一元二次方程的判别式_一元二次方程根的判别式知识点
- 《SEM长尾搜索营销策略解密》一一1.4 潜藏在海平线下的长尾世界
- 创建wincc项目提示无法连接到服务器,wincc 项目管理器 服务器不可用 无法连接到服务器...
- 常用的学术论文研究方法(着重讲解文献法)
- Oracle coherence介绍
- 游戏计算机中有缓冲内存吗,内存再大都不行!CPU缓存竟这么重要
- intel收购Altera
- 写给应届毕业生-------五险一金以及个人所得税缴纳计算
- 饮品类公众号引流到企微,搭建私域模型,实现粉丝快速增长
- 311、FirebaseAnalytics和Google Analytics总结