GradientDescentOptimizer.minimize() 是如何工作的?
How does GradientDescentOptimizer.minimize() work?
关于 TensorFlow,我对 GradientDescentOptimizer.minimize()
的实际工作方式感到困惑。通过下面的代码更具体地说,调用minimize(error)
如何修改m
,b
以便当我只调用sess.run([m, b])
时,它们return修改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
你的优化器和 m 和 b 等可训练变量之间的 link 就是这样。
可训练变量
您可以将此参数设置为 False 以从训练中排除任何变量。在您的代码中,默认情况下 trainable 为 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。
关于 TensorFlow,我对 GradientDescentOptimizer.minimize()
的实际工作方式感到困惑。通过下面的代码更具体地说,调用minimize(error)
如何修改m
,b
以便当我只调用sess.run([m, b])
时,它们return修改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
你的优化器和 m 和 b 等可训练变量之间的 link 就是这样。
可训练变量
您可以将此参数设置为 False 以从训练中排除任何变量。在您的代码中,默认情况下 trainable 为 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。