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中的其他两个参数无法优化,我该怎么办?
答案 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)