K. *_*olm 5 python optimization tensorflow
我正在尝试使用 TensorFlow 的梯度下降优化器来求解二维 Rosenbrock 函数,但是当我运行程序时,优化器有时会趋向于无穷大。有时,在不改变任何东西的情况下,它可以找到正确的邻域,但不能确定最佳解决方案。
我的代码如下:
import tensorflow as tf
x1_data = tf.Variable(initial_value=tf.random_uniform([1], -10, 10),name='x1')
x2_data = tf.Variable(initial_value=tf.random_uniform([1], -10, 10), name='x2')
# Loss function
y = tf.add(tf.pow(tf.sub(1.0, x1_data), 2.0),
tf.mul(100.0, tf.pow(tf.sub(x2_data,tf.pow(x1_data, 2.0)), 2.0)), 'y')
opt = tf.train.GradientDescentOptimizer(0.0035)
train = opt.minimize(y)
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
for step in xrange(200):
sess.run(train)
if step % 10 == 0:
print(step, sess.run(x1_data), sess.run(x2_data), sess.run(y))
Run Code Online (Sandbox Code Playgroud)
Rosenbrock 问题定义为 y = (1 - x1)^2 + 100 * (x2 - x1^2)^2,给出 x1 = x2 = 1 上的最优解
我做错了什么?还是我完全误解了如何使用 TensorFlow?
如果您减少初始 x1/x2 的变化(例如使用 -3/3 而不是 -10/10)并将学习率降低 10 倍,则它不会经常爆炸。当你看到事情出现分歧时降低学习率通常是一个不错的尝试。
此外,您正在优化的函数是为了难以找到全局最小值而设计的,因此它找到山谷而不是全局最优值也就不足为奇了;)