我想在具有tensorflow的dataset_A上建模,使用tf.train.Saver将模型保存到检查点文件中 . 然后使用dataset_B在下一次恢复模型并在图表中恢复 fine tune some variables (即不是所有的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),我必须得到optimizervar_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:0tf.trainable_variables中的第一项 . 所以我得到这样的变量:

full_connect_W = tf.trainable_variables()[0]
  • 所以第一个问题是:是否有像 get_variableget_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 [[Node:beta1_power_2 / read = IdentityT = DT_FLOAT,class = [“loc:@ finetune / full_connect_W”], device =“/ job:localhost / replica:0 / task:0 / gpu:0“]]由op u'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()初始化,那么在训练前短语中训练的所有权重(变量)都将被重置 .

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