是否可以在tensorflow中分别计算两种梯度

Is it possible to calculate two kinds of gradient separately in tensorflow

w_1   = tf.get_variable("w_1", shape)   
w_2   = tf.get_variable("w_2", shape) 
output = tf.mul(w_1, w_2)
.....
.....
optimizer = tf.train.AdamOptimizer(alpha).minimize(self.cost)

我们知道,当我们运行 "optimizer"时,tensorflow会计算梯度并更新w_1 & w_2.

但我想做的是,首先,我想将w_1视为一个常数,我只想计算梯度并更新只有w_2。其次,将w_2视为常数并计算梯度并仅更新w_1。我想轮流做这些事情。

其实我以前看过这个:。但是我使用 BasicLSTMCell 模块。我试试这个代码:print (tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)),它显示在我的神经网络中有 四种 种参数, 这意味着除了 w_1 和 w_2,BasicLSTMCell中还有另外两个参数。 那么,如果我使用如var_list=[w_1],BasicLSTMCell中的其他两个参数无法优化,我该怎么办?

BasicLSTMCell 有可能以某种方式让您访问其 Variables 的内部集合,您可以将其传递给 var_list。但更通用的方法也可能是直接从优化器接口获取梯度:

optimizer = tf.train.AdamOptimizer(alpha)

grads_and_vars = optimizer.compute_gradients(self.cost)

grads_and_vars 是一个元组列表 (gradient, variable)。您可以过滤掉您想要保留的那些,然后应用其余的:

optimizer.apply_gradients(filtered_grads_and_vars)

这很棘手,但可以做你想做的事。诀窍是通过 排除 w_1(或 w_2)从列表中定义一个 var_list,当你想保持它不变时。例如,您可以使用列表理解来根据变量的(唯一)名称匹配变量,如下所示:

w_1 = tf.get_variable("w_1", shape)   
w_2 = tf.get_variable("w_2", shape) 
output = tf.mul(w_1, w_2)

variables_without_w_1 = [v for v in tf.trainable_variables() if v.name != w_1.name]
variables_without_w_2 = [v for v in tf.trainable_variables() if v.name != w_2.name]

optimizer_without_w_1 = tf.train.AdamOptimizer(alpha).minimize(
    self.cost, var_list=variables_without_w_1)
optimizer_without_w_2 = tf.train.AdamOptimizer(alpha).minimize(
    self.cost, var_list=variables_without_w_2)