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

8e036b602d7d8a7d1424690054afb5e4.png

摘要

基于tensorflow训练的模型一般被保存为ckpt形式的文件,随着当前深度学习模型网络越来越大,对应模型也会非常大。当对外提供服务的时候,如果采用ckpt的形式,服务进程被调起来非常困难,且推理服务一般速度也较慢(会达到100ms以上一次推理)。所以,使用固化后的模型进行推理服务非常必要,模型大小得到压缩,服务时耗也得到大幅度降低。本文介绍几种常见的模型固化方法。

1 session模式的模型

先行训练好check point形式的模型文件,之所以这里区分session模式,因为这种模式使用者比较容易设置name_scope以及Tensor的命名,特别是输入、输出节点的名称,这样对于后面的固化非常重要。代码如下:

#!/usr/bin/env python

# coding=utf-8

from __future__ import print_function

import os,sys,time

import numpy as np

import tensorflow as tf

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"

os.environ["CUDA_VISIBLE_DEVICES"] = "7"

import tensorflow.contrib.slim as slim

from tensorflow.python.framework import graph_util

#此文件可以把ckpt模型转为pb模型

def freeze_graph(input_checkpoint,output_graph):

# checkpoint = tf.train.get_checkpoint_state(model_folder) #

# input_checkpoint = checkpoint.model_checkpoint_path #

output_node_names = "score_student/output_student"

saver = tf.train.import_meta_graph(input_checkpoint + '.meta', clear_devices=True)

graph = tf.get_default_graph()#

input_graph_def = graph.as_graph_def()#

with tf.Session() as sess:

saver.restore(sess, input_checkpoint)

output_graph_def = graph_util.convert_variables_to_constants(

sess=sess,

input_graph_def=input_graph_def,# :sess.graph_def

output_node_names=output_node_names.split(","),

variable_names_whitelist=None,variable_names_blacklist=None)#

with tf.gfile.GFile(output_graph, "wb") as f: #

f.write(output_graph_def.SerializeToString()) #

print("%d ops in the final graph." % len(output_graph_def.node))

#

input_checkpoint='/data/.../best_validation'

out_pb_path='/data/.../pbmodel/frozen_model_for_best_validation20190821.pb'

freeze_graph(input_checkpoint, out_pb_path)

2 estimator形式的模型

包括TPUEstimator形式,最常见的就是BERT模型[1]了,你很难去找里面的各种tensor的变量(本人亲自尝试使用tensorboard进行查找)。【当然使用一次迁移学习转换一下形式也是可以解决这个问题的】,这里提供另外一种简单的解决方法,代码如下:【相关表达方式还有好几种】

首先使用正常模型训练一个ckpt形式的模型,然后进行转化pb格式固化。

在bert代码中注释掉原来的train步骤

#estimator.train(input_fn=train_input_fn, max_steps=num_train_steps)

#定义里面的输入数据名称及shape:

feature_spec = {

"input_ids": tf.FixedLenFeature([FLAGS.max_seq_length], tf.int64),

"input_mask": tf.FixedLenFeature([FLAGS.max_seq_length], tf.int64),

"segment_ids": tf.FixedLenFeature([FLAGS.max_seq_length], tf.int64),

"start_ps": tf.FixedLenFeature([], tf.int64),#@debuluoyi

"end_ps": tf.FixedLenFeature([], tf.int64),#@debuluoyi

"label_ids": tf.FixedLenFeature([], tf.int64), }

#固化转换

receiver_fn=tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)

estimator._export_to_tpu = False

print("begin to export_savedmodel el model.pb") estimator.export_savedmodel('/data/.../pbmodel/bert_el_model20191023_2_pbmodel',serving_input_receiver_fn =receiver_fn)

3 小结

模型固化对于对外提供服务很重要,另外还有一个很重要的点就是接下来进行压缩,压缩很多基于pb固化模型进行也有多种方便,由此体现模型固化在实际算法工程中是非常重要且常见的技术点,一般能够将模型大小压缩数倍,服务调起更加轻便,基于GPU的推理时间也能节约数倍。

参考文献

[1] https://github.com/google-research/bert;

google-research/bert​github.com
1887410f9021448f2fd0353ab9187d06.png

[2] 本人GitHub:

debuluoyi - Overview​github.com
af35f491d30cb2bda266e7be14a909c3.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度linux内核升级,深度操作系统 2020.11.11 更新发布:内核升级

原标题:深度操作系统 2020.11.11 更新发布:内核升级IT之家11月11日消息 今日,深度操作系统宣布2020.11.11 更新现已发布。本次更新包括升级内核、Debian 10.6 仓库以及系统安全性更新。系统安全方面,本次更新修复了 Firefox-ESR 安…

python爬电影_使用Python多线程爬虫爬取电影天堂资源

最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载。刚开始学习python希望可以获得宝贵的意见。 先来简单介绍一下,网络爬虫的基本实…

sentinel 端口_Sentinel原理:控制台是如何获取到实时数据的

Sentinel 系列教程,现已上传到 github 和 gitee 中:GitHub:https://github.com/all4you/sentinel-tutorialGitee:https://gitee.com/all_4_you/sentinel-tutorialSentinel 能够被大家所认可,除了他自身的轻量级&#x…

python 最小二乘回归 高斯核_「机器学习」一文读懂线性回归、岭回归和Lasso回归...

点击上方蓝色字体,关注AI小白入门哟作者 | 文杰编辑 | yuquanle本文介绍线性回归模型,从梯度下降和最小二乘的角度来求解线性回归问题,以概率的方式解释了线性回归为什么采用平方损失,然后介绍了线性回归中常用的两种范数来解决过…

优先队列默认是小顶堆吗_一分钟带你读懂什么是堆?

堆其实就是一种特殊的队列——优先队列。 普通的队列游戏规则很简单:就是先进先出;但这种优先队列搞特殊,不是按照进队列的时间顺序,而是按照每个元素的优先级来比拼,优先级高的在堆顶。 这也很容易理解吧,…

python 注释一段话_Python快速入门(一)

引言Python作为一个,目前最火的编程语言之一,已经渗透到了各行各业。它易学好懂,拥有着丰富的库,功能齐全。人生苦短,就用Python。这个快速入门系列分为六篇,包含了Python大部分基础知识,每篇阅…

linux ibus获取窗体位置,Ubuntu 12.04 显示ibus 的输入框

在虚拟机中安装了Ubuntu 12.04,系统是英文版本的,我能接受,但是苦于没有中文输入法。起先,我是安装SCIM,结果我折腾了半天,发现其只能在lib-office下使用。firefox,文字编辑器中都不能调出SCIM。无奈将其卸…

python批量下载文件教程_Python抓包菜鸟教程:批量下载图片的方法,电脑和手机都能用...

笔者看上了一组图集,然后准备一张一张下载时,瞄了一眼,这组图集还有100,好吧,我酸了。 笔者就是试试工具,你们别像我这样用,这么好的工具,做自媒体,那绝对了那如何批量下…

esxi挂载Linux的nfs盘,ESXi安装centos7挂载群晖NFS

前段时间折腾了ESXi,然后无尽的折腾接踵而来,今天要说的是如何安装centos7并挂载群晖虚拟机的NFS共享文件夹直接步入正题!先是下载centos7镜像,因为我是用来当服务器的,所以只需要minimal版即可【centos下载链接】自己…

传统的6d位姿估计fangfa1_李飞飞团队最新论文:基于anchor关键点的类别级物体6D位姿跟踪...

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达简介作者提出了一种基于RGB-D的深度学习方法6PACK,能够实时的跟踪已知类别物体。通过学习用少量的3D关键点来简洁地表示一个物体,基于这些关键点,通过关键点匹配来估计物体在…

安卓system镜像分区_玩机爱好者想要的PT分区到底是什么?可以使现有的安卓系统更快!...

小编第一次看见PT分区这个词。就比较好奇他到底是什么神仙技术。今天,小编给大家科普一下,可能小编理解的也不是特别准确,请各位谅解!! 欢迎关注小编。各位玩机爱好者总是沉浸在各种ROM包、第三发Rec,以及各…

python求和1到100_python等差数列求和公式前 100 项的和实例

python等差数列求和公式前 100 项的和实例 最近跑去学了下python,一个很简单的题,结果发现数学公示忘了,在不用for循环的情况下居然有些懵,记录为下.. 题:等差数列可以定义为每一项与它的前一项的差等于一个常数,可以用…

jupyter kernel_新乡联通案例分享:Jupyter开发环境配置的常用技巧

Jupyter开发环境配置的常用技巧新乡联通网管中心 邢少华Python开发环境中,大部分人使用的是Jupyter,在Jupyter中有几个令人困扰的问题:1. Jupyter的默认打开目录如何修改2. Jupyter默认使用的浏览器如何修改3. 好用的Jupyter插件如何安装4.…

二叉树 中序遍历 python_LeetCode 105 树 从前序与中序遍历序列构造二叉树(Medium)

17(105) 从前序与中序遍历序列构造二叉树(Medium)描述根据一棵树的前序遍历与中序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。示例例如,给出前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7]返回如下的二叉树:3/ 9 20/ 1…

计算payload长度c语言,C语言0长度数组(可变数组/柔性数组)详解

1 零长度数组概念众所周知, GNU/GCC 在标准的 C/C 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展.多数情况下, 其应用在变长数组中, 其定义如下struct Packet{ int state; int len; char cData[0]; //这里的0长结构体就为变长结构体提供…

go语言调用c 的头文件 so,golang 学习(10): 使用go语言调用c语言的so动态库-Go语言中文社区...

一、前言最近在学习go,因为需要调用c语言打包成的so动态库里面的方法,避免自己再去造轮子,所以想直接使用golang调用so,但是参考了其他博客大佬写的,我每一步原封不动的写下来,结果都是一堆错误&#xff0c…

android 开机动画 渐变,[Parallax Animation]实现知乎 Android 客户端启动页视差滚动效果...

前言Parallax Scrolling (视差滚动),是一种常见的动画效果。视差一词来源于天文学,但在日常生活中也有它的身影。在疾驰的动车上看风景时,会发现越是离得近的,相对运动速度越快,而远处的山川河流只是缓慢的移动着&…

python可以做计量分析吗_技术分享 - python数据分析(2)——数据特征分析(上)...

1 分布分析 分布分析能揭示数据的分布特征和分布类型。对于定量数据,欲了解其分布形式是对称的还是非对称的,发现某些特大或特小的可疑值,可通过绘制频率分布表、绘制频率分布直方图、绘制茎叶图进行直观地分析;对于定性分类数据&…

matlab的7.3版本是什么_乐建工程宝V6.3版本升级说明公告

尊敬的乐建工程宝客户:您好!为了给客户提供更加优质的产品和服务,我司已于2019年11月20日开始乐建工程宝V6.3版本升级服务。目前,Android系统各应用市场已基本审核完毕,iOS系统已上传AppStore,目前苹果官方…

origin设置不同区域的颜色_[测试狗]Origin入门教程(二十四):效率翻倍小技巧——修改默认字体...

在使用Origin的时候,对于每次绘图都需要更改字体觉得很麻烦,因为Origin默认的字体为Arial,但是我们常用的字体一般为Times New Roman,在下拉框的很底部,每次更改都很浪费时间。那为什么不把他设置成默认字体呢&#xf…