tensorflow从与训练网络模型中fine-tune部分网络层参数

方法1:
1,开启tf的训练,有ckpt生成时停止,使用以下语句获得相关层变量的全称:

var_names=tf.contrib.framework.list_variables("/Users/kylefan/hobotrl/log/AutoExposureDPGVGG/model.ckpt-0")

2,手工制作一个ckpt文件:挨个对上一步中的变量赋值,然后tf.saver….保存下来这个新的ckpt,代替掉上一步的ckpt,并且修改checkpoint这个文件里的路径

    with tf.Session() as sess:
        i=0
        for var_name, _ in tf.contrib.framework.list_variables("/Users/kylefan/hobotrl/log/AutoExposureDPGVGG/model.ckpt-0"):
            # Load the variable
            i += 1
            # if i < 10:
            if var_name.startswith('learn/se'):
                if not (var_name.endswith('Adam') or var_name.endswith('Adam_1')):
                    value_npz = ckpt2npz_name(var_name) # translate var_name from npz to ckpt to get corresponding value
                    var = tf.Variable(weights[value_npz], name=var_name)

        # Save the variables
        saver = tf.train.Saver()
        sess.run(tf.global_variables_initializer())
        checkpoint_path = "/Users/kylefan/hobotrl/log/AutoExposureDPGVGG/from_npz/model.ckpt-0"
        # print checkpoint.model_checkpoint_path
        saver.save(sess, checkpoint_path)

3,指定restore_var_list,保证tf不至于因为提供的参数过少报错,并且打印出fine-tune的变量值以确保正确:

restore_var_list = []
        for var in tf.global_variables():
            if ('learn/se' in var.name) and ('Adam' not in var.name):
                restore_var_list.append(var)
        with agent.create_session(config=config, save_dir=args.logdir, restore_var_list=restore_var_list) as sess:
            all_vars = tf.global_variables()
            with open(args.logdir + "/weight_fine_tuned.txt", "w") as f:
                for var in all_vars:
                    f.write("{}\n".format(var.name))
                    var_value = sess.run(var)
                    f.write("{}\n\n".format(var_value))

方法2:
若有下载好的ckpt文件,从ckpt文件中直接fine-tune

the .ckpt file is the old version output of saver.save(sess), which is the equivalent of your .ckpt-data (see below)

the “checkpoint” file is only here to tell some TF functions which is the latest checkpoint file.

.ckpt-meta contains the metagraph, i.e. the structure of your computation graph, without the values of the variables (basically what you can see in tensorboard/graph).

.ckpt-data contains the values for all the variables, without the structure. To restore a model in python, you’ll usually use the meta and data files with (but you can also use the .pb file):

saver = tf.train.import_meta_graph(path_to_ckpt_meta)
saver.restore(sess, path_to_ckpt_data)
I don’t know exactly for .ckpt-index, I guess it’s some kind of index needed internally to map the two previous files correctly. Anyway it’s not really necessary usually, you can restore a model with only .ckpt-meta and .ckpt-data.

the .pb file can save your whole graph (meta + data). To load and use (but not train) a graph in c++ you’ll usually use it, created with freeze_graph, which creates the .pb file from the meta and data. Be careful, (at least in previous TF versions and for some people) the py function provided by freeze_graph did not work properly, so you’d have to use the script version. Tensorflow also provides a tf.train.Saver.to_proto() method, but I don’t know what it does exactly.

你可能感兴趣的:(tensorflow从与训练网络模型中fine-tune部分网络层参数)