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中with语句的用法
Apr 15 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
使用Python脚本生成随机IP的简单方法
Jul 30 Python
python timestamp和datetime之间转换详解
Dec 11 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
python celery分布式任务队列的使用详解
Jul 08 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
多个python文件调用logging模块报错误
Feb 12 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
Python如何实现机器人聊天
Sep 10 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
德劲1104的电路分析与改良
2021/03/01 无线电
PHP 验证码的实现代码
2011/07/17 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
vc6编写python扩展的方法分享
2014/01/17 Python
浅谈五大Python Web框架
2017/03/20 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
简单介绍django提供的加密算法
2019/12/18 Python
python turtle 绘制太极图的实例
2019/12/18 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
SmartBuyGlasses中国:唯视良品(销售名牌太阳镜、墨镜和眼镜框)
2017/07/03 全球购物
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
高中数学教师求职信
2013/10/30 职场文书
简单而又朴实的个人求职信分享
2013/12/12 职场文书
社区工作者感言
2014/03/02 职场文书
售后服务承诺书范文
2014/03/26 职场文书
预防传染病方案
2014/06/14 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫