• tensorflow中一种融合多个模型的方法


    1.使用场景

    假设我们有训练好的模型A,B,C,我们希望使用A,B,C中的部分或者全部变量,合成为一个模型D,用于初始化或其他目的,就需要融合多个模型的方法

    2.如何实现

    我们可以先声明模型D,再创建多个Saver实例,分别从模型A,B,C的保存文件(checkpoint文件)中读取所需的变量值,来达成这一目的,下面是示例代码:

    首先创建一个只包含w1,w2两个变量的模型,初始化后保存:

     1 def train_model1():
     2     w1 = tf.get_variable("w1", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
     3     w2 = tf.get_variable("w2", shape=[3, 1], initializer=tf.truncated_normal_initializer(), trainable=True)
     4     x = tf.placeholder(tf.float32, shape=[None, 3], name="x")
     5     a1 = tf.matmul(x, w1)
     6     input = np.random.rand(3200, 3)
     7     sess = tf.InteractiveSession()
     8     sess.run(tf.global_variables_initializer())
     9     saver1 = tf.train.Saver([w1,w2])
    10     for i in range(0, 1):
    11         w1_var,w2_var = sess.run([w1,w2], feed_dict={x: input[i * 32:(i + 1) * 32]})
    12         print w1_var
    13         print w2_var
    14         print '=' * 30
    15     saver1.save(sess, 'save1-exp')

    然后再创建一个只包含w2,w3两个变量的模型,也是初始化后保存:

     1 def train_model2():
     2     w2 = tf.get_variable("w2", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
     3     w3 = tf.get_variable("w3", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
     4     x = tf.placeholder(tf.float32, shape=[None, 3], name="x")
     5     a2 = tf.matmul(x, w2 * w3)
     6     input = np.random.rand(3200, 3)
     7     sess = tf.InteractiveSession()
     8     sess.run(tf.global_variables_initializer())
     9     saver2 = tf.train.Saver([w2,w3])
    10     for i in range(0, 1):
    11         w2_var, w3_var = sess.run([w2, w3], feed_dict={x: input[i * 32:(i + 1) * 32]})
    12         print w2_var
    13         print w3_var
    14         print '=' * 30
    15     saver2.save(sess, 'save2-exp')

    最后我们创建一个包含w1,w2,w3变量的模型,从上面两个保存的ckp文件中恢复:

     1 def restore_model():
     2     w1 = tf.get_variable("w1", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
     3     w2 = tf.get_variable("w2", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
     4     w3 = tf.get_variable("w3", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
     5     x = tf.placeholder(tf.float32, shape=[None, 3], name="x")
     6     a1 = tf.matmul(x, w1)
     7     a2 = tf.matmul(x, w2 * w3)
     8     loss = tf.reduce_mean(tf.square(a1 - a2))
     9     sess = tf.InteractiveSession()
    10     sess.run(tf.global_variables_initializer())
    11     saver1 = tf.train.Saver([w1,w2])
    12     saver1.restore(sess, 'save1-exp')
    13     saver2 = tf.train.Saver([w2, w3])
    14     saver2.restore(sess, 'save2-exp')
    15     saver3 = tf.train.Saver(tf.trainable_variables())
    16     input = np.random.rand(3200, 3)
    17     w1_var, w2_var, w3_var = sess.run([w1, w2, w3], feed_dict={x: input[0:32]})
    18     print w1_var
    19     print w2_var
    20     print w3_var
    21     print '=' * 30
    22     saver3.save(sess, 'save3-exp')

    然后保存,即完成了我们的目标

    3.注意事项

    3.1 取的模型中有同名变量

    假设同名变量为a,这种情况下,从不同模型中恢复的a是按照读取顺序覆盖到a中的,如果希望只读取特定ckpt保存的变量值,在创建读取其他ckpt的saver时,不要把a加入到var_list中

    3.2 模型D中有部分变量不在A,B,C中

    这种情况,恢复时会报错,需要指定var_list,只恢复当前cpkt中保存的变量

  • 相关阅读:
    Codeforces Round #590 D. Distinct Characters Queries
    线段树模板加模板题POJ3468
    hihoCoder挑战赛5 C 与链
    HDU 5044 Tree 树链剖分
    HYSBZ 1901 Dynamic Rankings 树状数组套主席树
    POJ 2761 Feed the dogs 主席树
    POJ 2104 K-th Number 主席树 区间第K大
    HDU 4547 CD操作 LCA
    POJ 1470 Closest Common Ancestors 离线LCA
    HYSBZ 1036 树的统计Count 树链剖分 线段树
  • 原文地址:https://www.cnblogs.com/hrlnw/p/10466145.html
Copyright © 2020-2023  润新知