在TensorFlow中,“trainable”和“stop gradient”有什么区别?

8
我想知道选项trainable=Falsetf.stop_gradient()之间的区别。如果我将trainable选项设置为False,我的优化器会不会忽略该变量进行训练?这个选项是否会使它在整个训练过程中成为一个常数值?
1个回答

10

trainable=False

在此处,变量值将在整个训练过程中保持不变。优化器不会考虑这个变量进行训练,也不会进行梯度更新操作。

stop_gradient

在某些情况下,您希望计算一个操作相对于某些变量的梯度,同时保持其他变量恒定;但是对于其他操作,您可能还需要使用这些变量来计算梯度。因此在这里,您不能使用trainable=False,因为您需要在其他操作中使用这些变量进行训练。 stop_gradient 对于操作非常有用; 您可以选择性地针对选定的变量优化操作,同时保持其他变量恒定。
y1 = tf.stop_gradient(W1x+b1)
y2 = W2y1+b2
cost = cost_function(y2, y)
# this following op wont optimize the cost with respect to W1 and b1
train_op_w2_b2 = tf.train.MomentumOptimizer(0.001, 0.9).minimize(cost)

W1 = tf.get_variable('w1', trainable=False)
y1 = W1x+b1
y2 = W2y1+b2
cost = cost_function(y2, y)
# this following op wont optimize the cost with respect to W1
train_op = tf.train.MomentumOptimizer(0.001, 0.9).minimize(cost)

请纠正我如果我错了。如果我想让一个变量在整个训练过程中保持不变,我会使用 trainable=False。但是,如果我希望有条件地训练一个变量,并且有时我不希望它被训练,我会使用 stop_gradient。我的理解正确吗? - pratsbhatt
那就是我所说的意思。 - Ishant Mrinal
1
在您的第一个示例中,如果您删除stop_gradient并对W1和b1使用trainable=False,则可以实现相同的效果,对吗?您能否举一个设置trainable=False无法工作但stop_gradient可以的示例? - max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接