Tensorflow:如何在约束下最小化



我面临着一个受约束、等式和不等式影响的数值优化问题。看起来对于这个任务,一切都在张量流中,阅读 https://www.tensorflow.org/api_docs/python/tf/contrib/constrained_optimization 等文档。

虽然我错过了一个最小的工作示例。我已经做了广泛的谷歌搜索,但没有结果。任何人都可以与我分享一些有用的资源吗?最好在急切模式下运行。

编辑:

我现在已经找到了 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/constrained_optimization

我仍然欢迎任何额外的资源。

您可以使用TF> 1.4可用的TFCO。

下面是一个我们想要最小化的具体示例:

(x - 2) ^ 2 + y

S.T.

  • x + y = 1
  • x> 0
  • y> 0
import tensorflow as tf
# Use the GitHub version of TFCO
# !pip install git+https://github.com/google-research/tensorflow_constrained_optimization
import tensorflow_constrained_optimization as tfco
class SampleProblem(tfco.ConstrainedMinimizationProblem):
    def __init__(self, loss_fn, weights):
        self._loss_fn = loss_fn
        self._weights = weights
   
    @property
    def num_constraints(self):
        return 4
   
    def objective(self):
        return loss_fn()
   
    def constraints(self):
        x, y = self._weights
        sum_weights = x + y
        lt_or_eq_one = sum_weights - 1
        gt_or_eq_one = 1 - sum_weights
        constraints = tf.stack([lt_or_eq_one, gt_or_eq_one, -x, -y])
        return constraints
x = tf.Variable(0.0, dtype=tf.float32, name='x')
y = tf.Variable(0.0, dtype=tf.float32, name='y')
def loss_fn():
    return (x - 2) ** 2 + y
problem = SampleProblem(loss_fn, [x, y])
optimizer = tfco.LagrangianOptimizer(
    optimizer=tf.optimizers.Adagrad(learning_rate=0.1),
    num_constraints=problem.num_constraints
)
var_list = [x,  y] + problem.trainable_variables + optimizer.trainable_variables()
for i in range(10000):
    optimizer.minimize(problem, var_list=var_list)
    if i % 1000 == 0:
        print(f'step = {i}')
        print(f'loss = {loss_fn()}')
        print(f'constraint = {(x + y).numpy()}')
        print(f'x = {x.numpy()}, y = {y.numpy()}')

自从我问这个问题以来,已经有一些赞成票,所以我想更多的人正在寻找解决方案。就我而言,对于我的特定问题,我决定从tensorflow移动到pyomo以运行约束优化。也许这可以帮助其他人。

最新更新