Tensorflow仅更新选定变量
概述:我只想更新网络中选定的变量。网络有部分Tensorflow仅更新选定变量,tensorflow,gradient,Tensorflow,Gradient,概述:我只想更新网络中选定的变量。网络有部分A->B(正向),每个部分都有单独的损耗La和Lb。我想训练a的权重a,以优化Lb。执行此操作时,应固定b的权重b。我该怎么做 方法1:仅选择a作为变量,使用优化器中的var\u列表进行最小化。最小化(损失,var\u列表=[a])。 . 这会导致崩溃,出现错误ValueError:没有为任何变量提供渐变,请检查图形中是否存在不支持渐变的操作,变量(…)和损失(…)。这实际上在其他场景中也很好,但显然它不喜欢权重b不在var\u列表中 编辑1:导致错误
A
->B
(正向),每个部分都有单独的损耗La
和Lb
。我想训练a
的权重a
,以优化Lb
。执行此操作时,应固定b
的权重b
。我该怎么做
方法1:仅选择a
作为变量,使用优化器中的var\u列表
进行最小化。最小化(损失,var\u列表=[a])
。
. 这会导致崩溃,出现错误ValueError:没有为任何变量提供渐变,请检查图形中是否存在不支持渐变的操作,变量(…)和损失(…)
。这实际上在其他场景中也很好,但显然它不喜欢权重b
不在var\u列表中
编辑1:导致错误的行:a_optim=tf.train.AdamOptimizer(args.lr,beta1=args.beta1)。最小化(self.a_损失,var_列表=self.a_vars,全局_步骤=self.global_步骤)
方法2:与方法1相同,但也包括变量列表中的b
。现在的问题是网络更新了a和b,而它应该只通过b
发送梯度,只更新a
编辑2:行可以工作,但不是我想要的:a_optim=tf.train.AdamOptimizer(args.lr,beta1=args.beta1)。最小化(self.a_损失,var_列表=self.a_vars+self.b_vars,全局_step=self.global_step)
方法3:使用tf.stop\u梯度(张量)
。从文档中,我推断这只会阻止渐变在图形中进一步向左流动。我想要右边的忽略变量
方法4:设置
tf.Variable(…,trainable=True)
,但如果我想在A和B之间交替训练,这看起来非常不灵活。结果是A中的最终op是不可微的(tf_argmax),因此显然梯度不能从B传递到A。我发现,为了更好地控制在优化过程中更新哪些变量,最好使用“计算梯度”和“应用梯度”方法
compute_梯度将返回梯度和变量张量的元组列表。您可以根据需要修改返回的梯度张量,还可以选择要更新的变量子集
然后,传递要更新为“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={...})
此外,由于您有两个丢失函数,因此应该创建两个列车操作
希望这有帮助 你能通过一个重现方法1错误的示例代码吗?这应该是做这件事的方法。也许有一只虫子。您使用的是什么版本的tensorflow?谢谢,我添加了两个编辑以显示可用的版本和不可用的版本。我用的是最新的v。TensorFlow的0.12。