tensorflow没有output结点,存储成pb文件的例子


Posted in Python onJanuary 04, 2020

Tensorflow中保存成pb file 需要 使用函数

graph_util.convert_variables_to_constants(sess, sess.graph_def,

output_node_names=[]) []中需要填写你需要保存的结点。如果保存的结点在神经网络中没有被显示定义该怎么办?

例如我使用了tf.contrib.slim或者keras,在tf的高层很多情况下都会这样。

在写神经网络时,只需要简单的一层层传导,一个slim.conv2d层就包含了kernal,bias,activation function,非常的方便,好处是网络结构一目了然,坏处是什么呢?

tensorflow没有output结点,存储成pb文件的例子

在尝试保存pb的 output node names时,需要将最后的输出结点保存下来,与这个结点相关的,从输入开始,经过层层传递的嵌套函数或者操作的相关结点,都会被保存,但无效的例如 计算准确率,计算loss等,就可以省略了,因为保存的pb主要是用来做预测的。

在准备查看所有的结点名称并选取保存时,发现scope "local3"里面仅有相关的weights 和biases,这两个是单独存在的,即保存这两个参数并没有任何意义。

tensorflow没有output结点,存储成pb文件的例子

那么这时候有两种解决办法:

方法一:

graph_util.convert_variables_to_constants(sess, sess.graph_def, output_node_names=[var.name[:-2] for var in tf.global_variables()])

那么这个的意思是所有的variable的都被保存下来 但函数中要求的是 node name 我们通过 global_variables获得的是 变量名 并不是 节点名

(例如 output:0 就是变量名,又叫tensor name)

output就是 node name了。

在tensorboard中可以一窥究竟

tensorflow没有output结点,存储成pb文件的例子

通过这样 也可以将 所有的变量全部保存下来(但是你并不能使用,是因为你的output并没有名字,所以你不可以通过常用的sess.graph.get_tensor_by_name来使用)

方法二:

那就是直接改写神经网络了....当然了还是比较简单的,只要改写最后一个,改写成output即可,tensorflow中无论是 变量、操作op、函数、都可以命名,那么这个地方是一个简单的全连接,仅需要将weights*net(上一层的输出) +bias 即可,我们只要将bias相加的结果命名为 ouput即可:

with tf.name_scope('local3'):
 
  local3_weights = tf.Variable(tf.truncated_normal([4096, self.output_size], stddev=0.1))
 
  local3_bias = tf.Variable(tf.constant(0.1, shape=[self.output_size]))
 
result = tf.add(tf.matmul(net, local3_weights), local3_bias, name="output")

这样将上述的convert_variables_to_constants中的output_node_names只需要填写一个['output']即可,因为这一个output结点,需要从input开始,将所有的神经网络前向传播的操作和参数全部保存下来,因此保存的结点数量 和 方法一保存的结点数量是一样的(console显示都是 convert 24)。

完整的pb保存为:(我是将ckpt读入进来,然后存成pb的)

from tensorflow.python.platform import gfile
 
 
 
load_ckpt():
 
  path = './data/output/loss1.0/'
 
  print("read from ckpt")
 
  ckpt = tf.train.get_checkpoint_state(path)
 
  saver = tf.train.Saver()
 
  saver.restore(sess, ckpt.model_checkpoint_path)
 
 
 
def write2pb_file():
 
  constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph_def,
 
    output_node_names=["output"])
 
  with tf.gfile.GFile(path+'loss1.0.pb', mode='wb') as f:
 
  f.write(constant_graph.SerializeToString())
 
  print("Model is saved as " + path+'loss1.0.pb')
 
 
 
def main():
 
  load_ckpt()
 
  write2pb_file()

如果是简单的直接保存,那就更简单了。

pb文件的read,很多人会将一个net写成一个类,在引入的时候会将新建这个类,然后读入ckpt文件,这完全没有问题,但是在读取pb时,就会发生问题,因为pb中已经包含了图与参数,引入时会创建一个默认的图,但是net类中自己也会创建一个图,那么这时候你运行程序,参数其实并没有使用.pb的文件。

所以我们不能创建net类,然后直接读入.pb文件,对.pb文件,通过如下代码,获取.pb的graph中的输入和输出。

self.output = self.sess.graph.get_tensor_by_name("output:0")
 
self.input = self.sess.graph.get_tensor_by_name("images:0")

注意此时要加:0 因为你获取的不再是结点了,而是一个真实的变量,我的理解是,结点相当于一个类,:0是对象,默认初始化值就是对象的初始化。

然后就可以通过self.sess.run(self.output(feed_dict={self.input: your_input})))运行你的网络了!

以上这篇tensorflow没有output结点,存储成pb文件的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现登录人人网并抓取新鲜事的方法
May 11 Python
python基本语法练习实例
Sep 19 Python
python 检查文件mime类型的方法
Dec 08 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
QML使用Python的函数过程解析
Sep 26 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
python滑块验证码的破解实现
Nov 10 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
Feb 17 Python
python使用opencv resize图像不进行插值的操作
Jul 05 Python
python爬取youtube视频的示例代码
Mar 03 Python
python3.7.2 tkinter entry框限定输入数字的操作
May 22 Python
利用Python+OpenCV三步去除水印
May 28 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 #Python
根据tensor的名字获取变量的值方式
Jan 04 #Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
Jan 04 #Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 #Python
对tensorflow中的strides参数使用详解
Jan 04 #Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 #Python
TensorFlow tf.nn.max_pool实现池化操作方式
Jan 04 #Python
You might like
PHP中的cookie
2006/11/26 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
javascript表单验证大全
2015/08/12 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
jQuery实现Select左右复制移动内容
2016/08/05 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
python中字符串前面加r的作用
2015/06/04 Python
CentOS中使用virtualenv搭建python3环境
2015/06/08 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
python 画图 图例自由定义方式
2020/04/17 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
自我鉴定范文
2013/11/10 职场文书
预备党员思想汇报
2014/01/08 职场文书
销售员岗位职责范本
2014/02/03 职场文书
大学生活动总结模板
2014/07/02 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL