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

【时间】2019.12.03

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

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

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

.ckpt即checkpoint文件。

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

model.ckpt文件组成:
model.ckpt.meta
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权重。

有没有更简单的方法??

  • 10
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要将训练好的 TensorFlow 模型保存为 .pb 文件,您可以按照以下步骤进行操作: 1. 定义模型结构:在保存模型之前,您需要定义模型的结构,包括输入和输出节点的名称、形状和数据类型。您可以使用 TensorFlow 的高级 API(如 Keras)或自定义模型来定义模型结构。 2. 加载模型权重:将训练好的模型权重加载到定义的模型结构中。这可以通过加载已保存模型权重文件(如 .h5、.ckpt 等)或通过重新训练模型来实现。 3. 创建 SavedModel:使用 TensorFlow 的 `tf.saved_model.save` 函数将模型保存为 SavedModel 格式。SavedModel 是 TensorFlow 的一种标准模型保存格式,可以包含模型的计算图和变量值。 ```python import tensorflow as tf # 定义和加载模型权重 model = ... # 定义模型结构 model.load_weights('model_weights.h5') # 加载模型权重 # 保存为 SavedModel 格式 tf.saved_model.save(model, 'saved_model') ``` 这将会在指定路径下创建一个名为 `saved_model` 的文件夹,其中包含模型的计算图和变量值。 4. 导出为 .pb 文件:从 SavedModel 中导出所需的 .pb 文件。可以使用 TensorFlow 的 `tf.compat.v1.graph_util.convert_variables_to_constants` 函数将 SavedModel 的计算图和变量值转换为常量,并保存为 .pb 文件。 ```python from tensorflow.python.framework import graph_util # 加载 SavedModel saved_model_dir = 'saved_model' saved_model = tf.saved_model.load(saved_model_dir) # 将 SavedModel 转换为 .pb 文件 output_pb_file = 'model.pb' graph_def = graph_util.convert_variables_to_constants( saved_model.sess, saved_model.sess.graph_def, ['output_node_name']) with tf.io.gfile.GFile(output_pb_file, 'wb') as f: f.write(graph_def.SerializeToString()) ``` 将上述代码中的 `'output_node_name'` 替换为模型输出节点的名称。 现在,您应该已经成功将训练好的 TensorFlow 模型保存为 .pb 文件。请注意,这只是一个基本示例,具体的实现细节可能因您的模型结构和需求而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值