Tensorflow 在张量流中,可以分别计算两种梯度吗
我们知道,当我们运行“优化器”时,tensorflow将计算梯度并更新w_1和w_2 但我想做的是,首先,我想把w_1当作一个常数,我只想计算梯度,只更新w_2。其次,将w_2视为一个常数,计算梯度并仅更新w_1。我想轮流做这些事情 事实上,我以前见过这个:。但我使用的是BasicLSTMCell模块。我尝试了以下代码:Tensorflow 在张量流中,可以分别计算两种梯度吗,tensorflow,deep-learning,Tensorflow,Deep Learning,我们知道,当我们运行“优化器”时,tensorflow将计算梯度并更新w_1和w_2 但我想做的是,首先,我想把w_1当作一个常数,我只想计算梯度,只更新w_2。其次,将w_2视为一个常数,计算梯度并仅更新w_1。我想轮流做这些事情 事实上,我以前见过这个:。但我使用的是BasicLSTMCell模块。我尝试了以下代码:print(tf.get\u collection(tf.GraphKeys.TRAINABLE\u VARIABLES)),它表明在我的神经网络中有四种参数,这意味着除了w\u
print(tf.get\u collection(tf.GraphKeys.TRAINABLE\u VARIABLES))
,它表明在我的神经网络中有四种参数,这意味着除了w\u 1和w\u 2之外,在BasicLSTMCell中还有另外两个参数。
因此,如果我使用诸如
var\u list=[w\u 1]
,BasicLSTMCell中的其他两个参数无法优化,我该怎么做 有可能,甚至很可能,BasicLSTMCell
以某种方式允许您访问其变量的内部集合,您可以将其传递到var\u list
。但更通用的方法也可以是直接从优化器界面获取梯度:
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 = tf.train.AdamOptimizer(alpha)
grads_and_vars = optimizer.compute_gradients(self.cost)
做你想做的事很棘手,但也是可能的。诀窍是定义一个var_列表
,当你想保持它不变时,从列表中排除w_1
(或w_2
)。例如,可以使用列表理解根据变量(唯一)名称匹配变量,如下所示:
optimizer.apply_gradients(filtered_grads_and_vars)
您知道如何访问BasicLSTMCell内部变量集合吗?但这有一些限制-例如,无论出于何种原因,如果您想使用tf.stop_梯度,就我所知,无法区分您想要通过哪些梯度。
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)