tensorflow从ckpt和从.pb文件读取变量的值方式


Posted in Python onMay 26, 2020

最近在学习tensorflow自带的量化工具的相关知识,其中遇到的一个问题是从tensorflow保存好的ckpt文件或者是保存后的.pb文件(这里的pb是把权重和模型保存在一起的pb文件)读取权重,查看量化后的权重是否变成整形。

因此将自己解决这个问题记录下来,为了下一次遇到时,可以有所参考,也希望给有需要的同学一个可能的参考。

(1) 从保存的ckpt读取变量的值(以读取保存的第一个权重为例)

from tensorflow.python import pywrap_tensorflow 
import tensorflow as tf
with tf.Graph().as_default(): 
 with tf.Session() as sess: 
 ckpt = tf.train.get_checkpoint_state('./model_ckpt') #保存ckpt文件的文件夹
 if ckpt and ckpt.model_checkpoint_path: 
 reader = pywrap_tensorflow.NewCheckpointReader('./model_ckpt/model.ckpt-999') #自己保存的ckpt文件名
 all_variables = reader.get_variable_to_shape_map() 
 w1 = reader.get_tensor("Variable_1") 
 print(w1.shape) 
 print(w1) 
 else: print('No checkpoint file found')

(2) 从保存的.pb文件读取变量的值(以读取保存的第一个权重为例)

import tensorflow as tf
from tensorflow.python.framework import graph_util
from tensorflow.python.platform import gfile
import numpy as np
sess = tf.Session()
with gfile.FastGFile('Yourpb.pb', 'rb') as f: #自己保存的pb文件
 graph_def = tf.GraphDef()
 graph_def.ParseFromString(f.read())
 sess.graph.as_default()
 tf.import_graph_def(graph_def, name='') 
 print(sess.run('Variable_1:0'))

补充知识:如何从已存在的检查点文件(cpkt文件)种解析出里面变量——无需重新创建原始计算图

import tensorflow as tf
import os

CheckpointReader

tf.train.NewCheckpointReader是一个创建检查点读取器(CheckpointReader)对象的完美手段。 CheckpointReader中有几个非常有用的方法:

get_variable_to_shape_map() - 提供具有变量名称和形状的字典

debug_string() - 提供由检查点文件中所有变量组成的字符串

has_tensor(var_name) - 允许检查变量是否存在于检查点中

get_tensor(var_name) - 返回变量名称的张量

为了便于说明,我将定义一个函数来检查路径的有效性,并为您加载检查点读取器。

In [3]:

def load_reader(path):
 assert os.path.exists(path), "Provided incorrect path to the file. {} doesn't exist".format(path)
 return tf.train.NewCheckpointReader(path)

In [34]:

your_path = 'logs/squeezeDet1024x1024/train/model.ckpt-0'
reader = load_reader(your_path)

reader.debug_string()

用于返回包含以下内容的一个字符串:

variable name(变量名)

data type(数据类型)

tensor shape(张量类型)

它返回字符串的各元素间均用空格符' '分隔,你可以使用debug_string来创建一个变量名列表,如下所示:

In [53]:

all_var_descriptions = reader.debug_string().split()
var_names, var_shapes = all_var[::3], all_var[2::3]
print(var_names[:4])
print(var_shapes[:4])

输出:

['iou', 'fire9/squeeze1x1/kernels', 'fire9/squeeze1x1/biases', 'fire9/expand3x3/kernels/Momentum']
['[10,36864]', '[1,1,512,64]', '[64]', '[3,3,64,256]']

但是,对于完成同样的任务,更好的方法是使用reader.get_variable_to_shape_map()

reader.get_variable_to_shape_map()

用于返回包含所有变量及其形状名称的字典,变量作为字典的Key,形状作为Value。

In [66]:

saved_shapes = reader.get_variable_to_shape_map()
print('fire9/squeeze1x1/kernels:', saved_shapes['fire9/squeeze1x1/kernels'])
fire9/squeeze1x1/kernels: [1, 1, 512, 64]
reader.has_tensor(var_name)

返回bool值

这是一种方便的方法,允许您检查ckeckpoint中是否存在相关的变量。

In [51]:

names_that_exit = {var_name: reader.has_tensor(var_name) for var_name in var_names[:10]}
for key in names_that_exit:
 print(key.decode()+':', names_that_exit[key])
fire8/squeeze1x1/kernels/Momentum: True
fire9/expand3x3/kernels: True
iou: True
fire9/expand3x3/biases: True
fire9/expand1x1/kernels: True
fire9/expand3x3/kernels/Momentum: True
fire9/expand1x1/biases/Momentum: True
fire9/squeeze1x1/biases: True
fire9/expand1x1/kernels/Momentum: True
fire9/squeeze1x1/kernels: True
reader.get_tensor(tensor_name)

返回包含检查点的张量值的NumPy数组

正常使用方法是先恢复一个张量,然后用恢复的张量初始化你自己的变量:

In [60]:

def recover_var(reader, var_name):
 recovered_var = 'var to be recovered'
 try:
  recovered_var = reader.get_tensor(var_name)
 except:
  assert reader.has_tensor(var_name),\
  "{} variable doesn't exist in the check point. Please check the variable name".format(var_name)
 return recovered_var

In [67]:

checkpoint_var = recover_var(reader, 'conv1/kernels')
print ("Recovered variable has the following shape: \n", checkpoint_var.shape)
new_var = tf.Variable(initial_value=checkpoint_var, name="new_conv1")
print ("New variable will be initialized with recovered values and the following shape: \n", new_var.get_shape())
Recovered variable has the following shape: 
(3, 3, 3, 64)
New variable will be initialized with recovered values and the following shape: 
(3, 3, 3, 64)

以上这篇tensorflow从ckpt和从.pb文件读取变量的值方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
老生常谈进程线程协程那些事儿
Jul 24 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
python数据结构学习之实现线性表的顺序
Sep 28 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
python画图把时间作为横坐标的方法
Jul 07 Python
Python Pandas中根据列的值选取多行数据
Jul 08 Python
Python中如何添加自定义模块
Jun 09 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 Python
golang/python实现归并排序实例代码
Aug 30 Python
使用Python封装excel操作指南
Jan 29 Python
利用Python实时获取steam特惠游戏数据
Jun 25 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 #Python
Django+Celery实现动态配置定时任务的方法示例
May 26 #Python
python删除某个目录文件夹的方法
May 26 #Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 #Python
Pytorch转onnx、torchscript方式
May 25 #Python
使用pandas库对csv文件进行筛选保存
May 25 #Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
May 25 #Python
You might like
PHP调用三种数据库的方法(3)
2006/10/09 PHP
MySQL连接数超过限制的解决方法
2011/07/17 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
让Python代码更快运行的5种方法
2015/06/21 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
python super的使用方法及实例详解
2019/09/25 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
如何写毕业求职自荐信
2013/11/06 职场文书
大学生饮食配送创业计划书
2014/01/04 职场文书
给同事的道歉信
2014/01/11 职场文书
好家长事迹材料
2014/01/23 职场文书
安全标准化汇报材料
2014/02/03 职场文书
2014年公司庆元旦活动方案
2014/03/05 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
大学四年个人总结
2015/03/03 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
初中班干部工作总结
2015/08/10 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang