Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow仅更新选定变量_Tensorflow_Gradient - Fatal编程技术网

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。