概述:我想仅更新网络中的选定变量。该网络包含部分A
- > B
(正向),每个部分都有单独的损失La
和Lb
。我想训练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之间轮换培训,那看起来非常不灵活。
答案 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个列车操作。
希望这有帮助!