Spe*_*pen 5 python optimization tensorflow
我尝试在 TensorFlow 中实现优化算法的可视化。
因此我从比尔函数开始
全局最小值为
我想从这一点开始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)
Run Code Online (Sandbox Code Playgroud)
显然这是行不通的。我想我必须定义正确的损失,但是如何定义呢?澄清一下:我的问题是我不明白 TensorFlow 是如何工作的,而且我不太了解 python(来自 Java、C、C++、Delphi 等)。我的问题不是关于它是如何工作的以及最好的优化方法是什么,而是关于如何以正确的方式实现它。
哦,我已经能弄清楚了。问题是我需要将 x 和 y 的最大值和最小值剪裁为 -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)
Run Code Online (Sandbox Code Playgroud)
如果有人知道是否可以向此代码添加多个神经元/层,请随时写下答案。