如何恢复模型(图形和权重)并微调一些变量?

时间:2017-02-23 14:18:20

标签: python tensorflow

我想用tensorflow 预训练数据集_A上的模型,使用tf.train.Saver将模型保存到检查点文件中。然后使用dataset_B在下一次恢复模型并在图表中微调一些变量(即不是所有的trainable_variables)。

在训练前阶段(pretrain.py),变量定义如下:

with tf.variable_scope("finetune"):
    full_connect_W = tf.get_variable(name="full_connect_W", shape=[n_hidden, num_class], initializer=tf.random_normal_initializer())

在微调阶段(finetune.py),我必须得到optimizer var_list 的变量。下面的代码提出了ValueError:

with tf.variable_scope("finetune") as scope:
    scope.reuse_variables()
    full_connect_w = tf.get_variable("full_connect_W:0")
  

ValueError:变量finetune / full_connect_W:0不存在,或者未使用tf.get_variable()创建。你的意思是在VarScope中设置reuse = None吗?   在这里输入代码

即使我删除后缀":0"在变量名中,再次引发相同的错误。

  

ValueError:变量finetune / full_connect_W不存在,或者未使用tf.get_variable()创建。你的意思是在VarScope中设置reuse = None吗?

我设法以丑陋的方式解决了这个问题。我恢复了检查点文件,发现 finetune / full_connect_W:0 tf.trainable_variables中的第一项。所以我得到这样的变量:

full_connect_W = tf.trainable_variables()[0]
  • 所以第一个问题是:是否有任何方法,如 get_variable get_tensor_by_xxx 来获取我想要微调的变量?

另一个问题是,当我尝试使用在微调阶段(finetune.py)中定义的新优化器训练模型时,会发生一些错误。似乎优化器需要初始化。

full_connect_W = tf.trainable_variables()[0]
full_connect_b = tf.trainable_variables()[1]
finetune_varlist = [full_connect_W, full_connect_b]
cost = g.get_tensor_by_name("cost:0")
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost, var_list=finetune_varlist)
  

tensorflow.python.framework.errors.FailedPreconditionError:尝试使用未初始化的值beta1_power_2

     

[[节点:beta1_power_2 /读取= IdentityT = DT_FLOAT,_class = [" loc:@ finetune / full_connect_W"],_ device =" / job:localhost / replica:0 / task: 0 / GPU:0"]]   由op u&#beta; beta1_power_2 / read'引起,定义于:

     

文件" finetune_lstm_videotitle_test.py",第72行,在       optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(cost,var_list = finetune_varlist)

但是如果我用tf.initialize_all_variables()初始化,那么在训练前短语中训练的所有权重(变量)都将被重置。

  • 所以第二个问题是:如何微调特定变量并修复其他变量?

0 个答案:

没有答案