tensorflow的模型保存文件.ckpt包含什么以及如何读取、并将其转换为Keras的.h5文件

您所在的位置:网站首页 saver怎么读 tensorflow的模型保存文件.ckpt包含什么以及如何读取、并将其转换为Keras的.h5文件

tensorflow的模型保存文件.ckpt包含什么以及如何读取、并将其转换为Keras的.h5文件

2024-01-11 13:05| 来源: 网络整理| 查看: 265

【时间】2019.12.03

【题目】tensorflow的模型保存文件.ckpt包含什么以及如何读取、并将其转换为Keras的.h5文件

参考:tensorflow中读取模型中保存的值, tf.train.NewCheckpointReader

一、tensorflow的模型保存文件.ckpt

.ckpt即checkpoint文件。

一个标准的.ckpt模型文件以下文件:

model.ckpt文件组成: model.ckpta model.ckpt.data-00000-of-00001 model.ckpt.index 二、读取.ckpt文件中的内容

使用 NewCheck =tf.train.NewCheckpointReader(ckpt_file)读取:

import tensorflow as tf import pprint # 使用pprint 提高打印的可读性 NewCheck =tf.train.NewCheckpointReader("model.ckpt") 2.1.打印模型中的所有变量 print("debug_string:\n") pprint.pprint(NewCheck.debug_string().decode("utf-8")) #类型是str

在这里插入图片描述

其中有3个字段, 分别是名字name, 数据类型type, 尺寸shape

2.2 获取变量中的值--get_tensor print("get_tensor:\n") pprint.pprint(NewCheck.get_tensor("D/conv2d/bias"))

在这里插入图片描述

2.3 、 2.2相当于:NewCheck.get_variable_to_dtype_map()+get_variable_to_shape_map()

不过得到的是字典类型的数据。

print("get_variable_to_dtype_map\n") pprint.pprint(NewCheck.get_variable_to_dtype_map()) print("get_variable_to_shape_map\n") pprint.pprint(NewCheck.get_variable_to_shape_map())

在这里插入图片描述

在这里插入图片描述

三、读取ckpt文件的权重并转换为keras的.h5文件

代码:

代码来自:https://github.com/johannesu/NASNet-keras

def load_weights_from_tf_checkpoint(model, checkpoint_file, background_label): print('Load weights from tensorflow checkpoint') progbar = Progbar(target=len(model.layers)) reader = tf.train.NewCheckpointReader(checkpoint_file) for index, layer in enumerate(model.layers): progbar.update(current=index) if isinstance(layer, layers.convolutional.SeparableConv2D): depthwise = reader.get_tensor('{}/depthwise_weights'.format(layer.name)) pointwise = reader.get_tensor('{}/pointwise_weights'.format(layer.name)) if K.image_data_format() == 'channels_first': depthwise = convert_kernel(depthwise) pointwise = convert_kernel(pointwise) layer.set_weights([depthwise, pointwise]) elif isinstance(layer, layers.convolutional.Convolution2D): weights = reader.get_tensor('{}/weights'.format(layer.name)) if K.image_data_format() == 'channels_first': weights = convert_kernel(weights) layer.set_weights([weights]) elif isinstance(layer, layers.BatchNormalization): beta = reader.get_tensor('{}/beta'.format(layer.name)) gamma = reader.get_tensor('{}/gamma'.format(layer.name)) moving_mean = reader.get_tensor('{}/moving_mean'.format(layer.name)) moving_variance = reader.get_tensor('{}/moving_variance'.format(layer.name)) layer.set_weights([gamma, beta, moving_mean, moving_variance]) elif isinstance(layer, layers.Dense): weights = reader.get_tensor('{}/weights'.format(layer.name)) biases = reader.get_tensor('{}/biases'.format(layer.name)) if background_label: layer.set_weights([weights, biases]) else: layer.set_weights([weights[:, 1:], biases[1:]]) def load_pretrained_weights(model, fname, origin, md5_hash, background_label=False, cache_dir=None): """Download and convert tensorflow checkpoints""" # origin = 'https://storage.googleapis.com/download.tensorflow.org/models/nasnet-a_large_04_10_2017.tar.gz' if cache_dir is None: cache_dir = os.path.expanduser(os.path.join('~', '.keras', 'models')) weight_path = os.path.join(cache_dir, '{}_{}_{}.h5'.format(model.name, md5_hash, K.image_data_format())) if os.path.exists(weight_path): model.load_weights(weight_path) else: if not os.path.exists(cache_dir): os.makedirs(cache_dir) print(cache_dir) path = get_file(fname, origin=origin, extract=True, md5_hash=md5_hash, cache_dir=cache_dir,cache_subdir='.') checkpoint_file = os.path.join(path, '..', 'model.ckpt') load_weights_from_tf_checkpoint(model, checkpoint_file, background_label) model.save_weights(weight_path)

分析:

1、用Keras代码构建model,并且每一层layer的name与.ckpt文件中的层名字相同。

2、实例化reader=tf.train.NewCheckpointReader()

3、对于model的每一层,根据layer的类别,reader.get_file(layer_name)获取权值(array数组),并使用layer.set_weights()进行赋值。

4、最后使用model.save_weights()保存.h5权重。

有没有更简单的方法??



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3