如何使用TensorFlow查找函数的最小值

时间:2017-07-22 00:35:04

标签: python optimization tensorflow

我尝试在TensorFlow中实现优化算法的可视化。

因此我开始使用Beale的功能

Baele's function Baele's function

全球最低值位于

global minimum

Beale的功能图看起来像这样 plot of Baele's function

我想从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,......)。我的问题不在于它是如何工作的以及最佳的优化方法是什么,它只是关于如何以正确的方式实现它。

1 个答案:

答案 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)

如果有人知道是否可以在此代码中添加多个神经元/图层,请随时写一个答案。