首页 > 解决方案 > GradientDescentOptimizer.minimize() 是如何工作的?

问题描述

关于 TensorFlow,我对它的GradientDescentOptimizer.minimize()实际工作方式感到困惑。更具体地说,通过下面的代码,调用如何minimize(error)修改m,b 以便当我调用时sess.run([m, b]),它们返回修改后的m,b值?我认为很难找到minimize()和 变量之间的任何联系,m并且b喜欢以下代码末尾的结果:

#Actaul Data
x_data = np.linspace(0, 10, 10) + np.random.uniform(-1.5, 1.5, 10)
y_label = np.linspace(0, 10, 10) + np.random.uniform(-1.5, 1.5, 10)

#Random Variables --> These variables will be be modified by minimize()
m = tf.Variable(0.44)
b = tf.Variable(0.87)

error = 0

for x, y in zip(x_data, y_label):
    error += (y - (m*x + b)) ** 2

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train = optimizer.minimize(error)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    training_steps = 100

    for i in range(training_steps):
        sess.run(train)

    final_slope, final_intercept = sess.run([m, b])

    print(final_slope, final_intercept) # 0.7535087, 0.83729243

标签: tensorflowtraining-datagradient-descent

解决方案


您的优化器与mb等可训练变量之间的联系是这样的。

可训练变量

您可以将此参数设置为False以从训练中排除任何变量。在您的代码中,默认情况下可训练为 True。如果trainable不是False,它将选择任何其他变量并尝试对其进行优化。

m = tf.Variable(0.44,trainable=False)
b = tf.Variable(0.87)

这种情况下的输出是

0.44 2.134535

显式传递 var_list

可以使用代码收集所有可训练变量。

variables = tf.trainable_variables()
allvariables = [var for var in variables]

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train = optimizer.minimize(error,var_list=variables)

因此,如果不是mx+b而是其他表达式,我们可以优化任何我们想要的。

可能还有其他高级方法来控制它。

with tf.variable_scope('discriminator'):
    c = tf.Variable(1.0)

variables = tf.trainable_variables()
allvariables = [var for var in variables if var.name.startswith("discriminator")]

这仅包括c


推荐阅读