是否可以在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)
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。我想轮流做这些事情。
其实我以前看过这个: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)