tensorflow生成ckpt文件并转化为.npy

1. tensorflow生成ckpt文件

直接在训练结束后使用下面两个语句即可:

saver = tf.train.Saver()
saver.save(sess, './名称')

如:
saver = tf.train.Saver()
saver.save(sess, ‘./my_checkpoint’)

此时会生成如下文件:

    |--checkpoint_dir
    |    |--checkpoint
    |    |--my_checkpoint.meta
    |    |--my_checkpoint.data-00000-of-00001
    |    |--my_checkpoint.index

在0.11版本之前TensorFlow模型仅包含三个文件:

    |--checkpoint_dir
    |    |--checkpoint
    |    |--my_checkpoint.meta
    |    |--my_checkpoint.ckpt

.meta文件是pb(protocol buffer)格式的文件,它保存的是图结构,包含变量、op、集合等。
.ckpt文件是二进制文件,保存了所有的weights、biases、gradients等变量。0.11版本后,通过两个文件保存,即.index和.data文件。

2. 将ckpt文件转化为npy

from tensorflow.python import pywrap_tensorflow
import numpy as np

# 定义一个字典,存放各层的名称和array,各层的名称与模型的结构有关
# autoencoder = {}
autoencoder = {'enc_conv1':[[],[]],'enc_conv2':[[],[]],'enc_conv3':[[],[]],
               'dec_conv1':[[],[]],'dec_conv2':[[],[]],'dec_conv3':[[],[]]}

# path为ckpt的路径名
# path举例:
path = 'C://Users//Administrator//Desktop//autoencoder//./my_checkpoint'
reader = pywrap_tensorflow.NewCheckpointReader(path)

# var_to_shape_map为存储的所有变量名
var_to_shape_map = reader.get_variable_to_shape_map()
# 可以先print所有的变量名,看看存储了哪些变量
# print(var_to_shape_map)

for key in var_to_shape_map:
    str_name = key
    
    # 因为模型使用Adam算法优化的,在生成的ckpt中,含有与Adam有关的tensor,不需要存储
    if str_name.find('Adam') > -1:
        continue
    if str_name.find('power') > -1:
        continue
    
    if str_name.find('/') > -1:
        names = str_name.split('/')
        layer_name = names[0]
        layer_info = names[1]
    else:
        layer_name = str_name
        layer_info = None
    
    # kernel和bias是各层的卷积核参数和偏置参数,具体的名称与层的类型有关
    if layer_info == 'kernel':
        autoencoder[layer_name][0]=reader.get_tensor(key)
    elif layer_info == 'bias':
        autoencoder[layer_name][1] = reader.get_tensor(key)
    else:
        autoencoder[layer_name] = reader.get_tensor(key)

# save npy
np.save('autoencoder.npy',autoencoder)
print('save npy over...')

3. 加载npy中存储的权重信息

def load_weights():
    # Load the weights into memory
    weights_dict = np.load("weights/autoencoder.npy").item()
    # list of all assignment operators
    assign_list = []
    # Loop over all layer names stored in the weights dict
    for op_name in weights_dict.keys():
        with tf.variable_scope(op_name, reuse=tf.AUTO_REUSE):
            # Assign weights/biases to their corresponding tf variable
            for data in weights_dict[op_name]:
                # bias
                if len(data.shape) == 1:
                    var = tf.get_variable('bias')
                    assign_list.append(var.assign(data))
                # kernel
                else:
                    var = tf.get_variable('kernel')
                    assign_list.append(var.assign(data))
    # create a group operator for all assignments
    return assign_list

在函数外部使用sess.run(load_weights())语句即可。

4. 另一种保存并读取npy比较简单的方式

适用场合:权重是显式定义的,并且数目不多。
保存: 使用eval()函数将Tensor转化为numpy,再使用np.savez()保存为字典。
读取: 如:

data = np.load('weights/autoencoder.npz')
self.weights['w1'] = tf.Variable(tf.convert_to_tensor(data['w1']))
self.weights['b1'] = tf.Variable(tf.convert_to_tensor(data['b1']))
self.weights['w2'] = tf.Variable(tf.convert_to_tensor(data['w2']))
self.weights['b2'] = tf.Variable(tf.convert_to_tensor(data['b2']))
参考链接:
  1. ckpt文件的概念和使用:https://www.cnblogs.com/adong7639/p/7764769.html
  2. 将ckpt文件转化为npy:https://blog.youkuaiyun.com/raby_gyl/article/details/79075716
    https://download.youkuaiyun.com/download/weixin_42713739/11317513
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值