tensorflow - 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
解决方案
您的优化器与m和b等可训练变量之间的联系是这样的。
可训练变量
您可以将此参数设置为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。
推荐阅读
- spring-mvc - 使用用于 Spring boot+Velocity 项目的 toolboxConfigLocation 渲染速度模板时的 NPE
- javascript - 引导导航不会在移动屏幕上折叠以进行同一页面导航(#sections)?
- intel - Intel 8086 CPU 的 20 位地址中如何存储 16 位数据?
- android - 不同页面中的数据库内容像相同的布局
- android - 当活动进入全屏模式时,如何阻止布局改变大小?
- java - 从 getOnKeyPressed 处理 EventHandler
- docker - 使用多个标签标记 docker 图像
- php - PHP 版本 7.1.21、XAMPP 中未启用 Xdebug
- go - 更改函数中的结构字段或返回值
- ms-access - 很难理解 MS Access 后端技术