转自:https://blog.csdn.net/dcrmg/article/details/79672874
参考:https://www.jb51.net/article/142183.htm
tensorflow训练后保存的模型主要包含两部分,一是网络结构的定义(网络图),二是网络结构里的参数值。
1. .meta文件
.meta 文件以 “protocol buffer”格式保存了整个模型的结构图,模型上定义的操作等信息。
这个文件保存了网络结构的定义。
例如 model.ckpt-3072.meta ,大小是 2.9 MB。
2. .data-00000-of-00001 文件和 .index 文件
.data-00000-of-00001 文件和 .index 文件合在一起组成了 ckpt 文件,保存了网络结构中所有 权重和偏置 的数值。
.data文件保存的是变量值,.index文件保存的是.data文件中数据和 .meta文件中结构图之间的对应关系(Mabey)。
例如 model.ckpt-3072.data-00000-of-00001,大小是 3.7 MB ; model.ckpt-3072.index ,大小是 15.5 KB。
3. checkpoint文件
checkpoint是一个文本文件,记录了训练过程中在所有中间节点上保存的模型的名称,首行记录的是最后(最近)一次保存的模型名称。
例如 checkpoint ,大小是 271字节。
查看 ckpt 模型文件中保存的 Tensor信息
查询变量名称和值:
################
# This code used to check msg of Tensor stored in ckpt
# work well with tensorflow version of 'v1.3.0-rc2-20-g0787eee'
################
import os
from tensorflow.python import pywrap_tensorflow
# code for finall ckpt
# checkpoint_path = os.path.join('~/tensorflowTraining/ResNet/model', "model.ckpt")
# code for designated ckpt, change 3890 to your num
checkpoint_path = os.path.join('~/tensorflowTraining/ResNet/model', "model.ckpt-3890")
# Read data from checkpoint file
reader = pywrap_tensorflow.NewCheckpointReader(checkpoint_path)
var_to_shape_map = reader.get_variable_to_shape_map()
# Print tensor name and values
for key in var_to_shape_map:
print("tensor_name: ", key)
print(reader.get_tensor(key))
部分输出信息截图,卷积:
偏置:
查看TensorFlow中checkpoint内变量的几种方法:
查看ckpt中变量的方法有三种:
注意:
1. 基于model来读取ckpt文件里的变量
1.首先建立model
2.从ckpt中恢复变量
with tf.Graph().as_default() as g:
#建立model
images, labels = cifar10.inputs(eval_data=eval_data)
logits = cifar10.inference(images)
top_k_op = tf.nn.in_top_k(logits, labels, 1)
#从ckpt中恢复变量
sess = tf.Session()
saver = tf.train.Saver() #saver = tf.train.Saver(...variables...) # 恢复部分变量时,只需要在Saver里指定要恢复的变量
save_path = 'ckpt的路径'
saver.restore(sess, save_path) # 从ckpt中恢复变量
注意:基于model来读取ckpt中变量时,model和ckpt必须匹配。
2. 使用tf.train.NewCheckpointReader直接读取ckpt文件里的变量,使用tools.inspect_checkpoint里的print_tensors_in_checkpoint_file函数打印ckpt里的东西
#使用NewCheckpointReader来读取ckpt里的变量
from tensorflow.python import pywrap_tensorflow
checkpoint_path = os.path.join(model_dir, "model.ckpt")
reader = pywrap_tensorflow.NewCheckpointReader(checkpoint_path) #tf.train.NewCheckpointReader
var_to_shape_map = reader.get_variable_to_shape_map()
for key in var_to_shape_map:
print("tensor_name: ", key)
#print(reader.get_tensor(key))
#使用print_tensors_in_checkpoint_file打印ckpt里的内容
from tensorflow.python.tools.inspect_checkpoint import print_tensors_in_checkpoint_file
print_tensors_in_checkpoint_file(file_name, #ckpt文件名字
tensor_name, # 如果为None,则默认为ckpt里的所有变量
all_tensors, # bool 是否打印所有的tensor,这里打印出的是tensor的值,一般不推荐这里设置为False
all_tensor_names) # bool 是否打印所有的tensor的name
#上面的打印ckpt的内部使用的是pywrap_tensorflow.NewCheckpointReader所以,掌握NewCheckpointReader才是王道
3.使用tools里的freeze_graph来读取ckpt
from tensorflow.python.tools import freeze_graph
freeze_graph(input_graph, #=some_graph_def.pb
input_saver,
input_binary,
input_checkpoint, #=model.ckpt
output_node_names, #=softmax
restore_op_name,
filename_tensor_name,
output_graph, #='./tmp/frozen_graph.pb'
clear_devices,
initializer_nodes,
variable_names_whitelist='',
variable_names_blacklist='',
input_meta_graph=None,
input_saved_model_dir=None,
saved_model_tags='serve',
checkpoint_version=2)
#freeze_graph_test.py讲述了怎么使用freeze_grapg。
使用freeze_graph可以将图和ckpt进行合并。