我尝试在TensorFlow中实现优化算法的可视化。
因此我开始使用Beale的功能
全球最低值位于
我想从f(x=3.0, y=4.0)
如何使用优化算法在TensorFlow中实现此功能?
我的第一次尝试看起来像这样
import tensorflow as tf
# Beale's function
x = tf.Variable(3.0, trainable=True)
y = tf.Variable(4.0, trainable=True)
f = tf.add_n([tf.square(tf.add(tf.subtract(1.5, x), tf.multiply(x, y))),
tf.square(tf.add(tf.subtract(2.25, x), tf.multiply(x, tf.square(y)))),
tf.square(tf.add(tf.subtract(2.625, x), tf.multiply(x, tf.pow(y, 3))))])
Y = [3, 0.5]
loss = f
opt = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(100):
print(sess.run([x, y, loss]))
sess.run(opt)
显然这不起作用。我想我必须定义一个正确的损失,但如何? 要澄清:我的问题是我不明白TensorFlow是如何工作的,我不太了解python(来自Java,C,C ++,Delphi,......)。我的问题不在于它是如何工作的以及最佳的优化方法是什么,它只是关于如何以正确的方式实现它。
答案 0 :(得分:3)
哦,我已经弄清楚了。 问题是我需要将x和y的max和min值剪切到-4.5和4.5,这样它们就不会爆炸到无限。
此解决方案有效:
import tensorflow as tf
# Beale's function
x = tf.Variable(3.0, trainable=True)
y = tf.Variable(4.0, trainable=True)
f = tf.add_n([tf.square(tf.add(tf.subtract(1.5, x), tf.multiply(x, y))),
tf.square(tf.add(tf.subtract(2.25, x), tf.multiply(x, tf.square(y)))),
tf.square(tf.add(tf.subtract(2.625, x), tf.multiply(x, tf.pow(y, 3))))])
opt = tf.train.GradientDescentOptimizer(0.01)
grads_and_vars = opt.compute_gradients(f, [x, y])
clipped_grads_and_vars = [(tf.clip_by_value(g, -4.5, 4.5), v) for g, v in grads_and_vars]
train = opt.apply_gradients(clipped_grads_and_vars)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(100):
print(sess.run([x, y]))
sess.run(train)
如果有人知道是否可以在此代码中添加多个神经元/图层,请随时写一个答案。