是否可以在张量流中分别计算两种梯度

时间:2016-05-28 09:33:41

标签: tensorflow deep-learning

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)

众所周知,当我们运行“优化器”时,tensorflow将计算梯度并更新w_1& W_2。

但我想做的是,首先,我想将w_1视为常量,我只想计算渐变并更新仅w_2 。其次,将w_2视为常量并计算渐变并仅更新 w_1 。我想轮流来做这些事情。

实际上,我之前已经看过:enter link description here。但我使用 BasicLSTMCell 模块。我尝试使用此代码:print (tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)),它显示我的神经网络中有四种种参数,表示除了w_1和w_2之外,BasicLSTMCell中还有其他两个参数。< /强> 因此,如果我使用诸如var_list=[w_1]之类的,则BasicLSTMCell中的其他两个参数无法优化,我该怎么办?

2 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分:1)

要做你想做的事,这很棘手,但也有可能。诀窍是,当您想要保持不变时,从列表中定义{em>排除 var_list(或w_1)的w_2。例如,您可以使用列表推导来根据(唯一)名称匹配变量,如下所示:

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)