Tensorflow仅更新选定的变量

时间:2017-01-18 18:26:56

标签: tensorflow gradients

概述:我想仅更新网络中的选定变量。该网络包含部分A - > B(正向),每个部分都有单独的损失LaLb。我想训练a的权重A以优化Lb。执行此操作时,b的权重B应该是固定的。我怎么能这样做?

方法1:仅选择a作为变量,以尽量减少使用var_list中的optimizer.minimize(loss, var_list=[a])https://github.com/tensorflow/tensorflow/issues/834。这会因错误ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables (...) and loss (...)而崩溃。这实际上在其他情况下工作正常,但显然它不喜欢权重b不在var_list中。

修改1:导致错误的行:a_optim = tf.train.AdamOptimizer(args.lr, beta1=args.beta1).minimize(self.a_loss, var_list=self.a_vars, global_step=self.global_step)

方法2:与方法1相同,但在var_list中也包含b。现在的问题是网络更新了a和b,而它应该只通过B发送渐变而只更新A

编辑2 :行有效,但不是我想要的行:a_optim = tf.train.AdamOptimizer(args.lr, beta1=args.beta1).minimize(self.a_loss, var_list=self.a_vars+self.b_vars, global_step=self.global_step)

方法3:使用tf.stop_gradient(tensor) Holding variables constant during optimizer。从文档中我推断,这只会阻止渐变在图中向左流动。我想要右边的忽略变量。

方法4:设置tf.Variable(..., trainable=True),但如果我想在A和B之间轮换培训,那看起来非常不灵活。

2 个答案:

答案 0 :(得分:0)

事实证明,A中的最终操作是不可微分的(tf_argmax),因此显然渐变不能从B传递到A.

答案 1 :(得分:0)

我发现,为了更好地控制在优化过程中要更新的变量,最好使用:' compute_gradients'和' apply_gradients'方法

compute_gradients将返回渐变和变量张量元组的列表。您可以根据需要修改返回的渐变张量,也可以选择要更新的变量子集。

然后,您将要更新的渐变和变量元组列表传递给' apply_gradients'

以下是一些例子:

optimizer = tf.train.AdamOptimizer(learning_rate=0.0001)
grads = optimizer.compute_gradients(your_cost_function)

# You can update 'g' and exclude some v's 
grad_lists = [(g, v) for g, v in grads]

train_op = optimizer.apply_gradients(grad_lists)

Then, run your session.

sess.run(train_op, feed_dict={...})

此外,由于您有2个损失功能,您应该创建2个列车操作。

希望这有帮助!