Как мы можем использовать lbfgs_minimize в TensorFlow 2.0 - PullRequest
1 голос
/ 28 октября 2019

Мне не удалось воспроизвести этот пример из тензорного потока с установленным тензорным потоком 2.0.

Это оригинальный фрагмент:

# A high-dimensional quadratic bowl.
ndims = 60
minimum = np.ones([ndims], dtype='float64')
scales = np.arange(ndims, dtype='float64') + 1.0

# The objective function and the gradient.
def quadratic(x):
    value = tf.reduce_sum(scales * (x - minimum) ** 2)
    return value, tf.gradients(value, x)[0]

start = np.arange(ndims, 0, -1, dtype='float64')
optim_results = tfp.optimizer.lbfgs_minimize(
  quadratic, initial_position=start, num_correction_pairs=10,
  tolerance=1e-8)

with tf.Session() as session:
    results = session.run(optim_results)
# Check that the search converged
assert(results.converged)
# Check that the argmin is close to the actual value.
np.testing.assert_allclose(results.position, minimum)

, который не работает со следующей ошибкой:

RuntimeError: tf.gradients не поддерживается при активном выполнениивключен. Вместо этого используйте tf.GradientTape.

Если я изменяю код и вместо этого использую градиентную ленту, как показано ниже:

def quadratic(x):

    x = tf.Variable(x, dtype='float64')
    with tf.GradientTape() as t:
        value = tf.reduce_sum(scales * (x - minimum) ** 2)
    grad = t.gradient(value, x)

    return value, grad

Я также получаю следующую ошибку:

TypeError: Тензор невозможен, если включено равенство Тензорных. Вместо этого используйте в качестве ключа тензор.экспериментальный_реф ().

В общем, все, что я пробовал, не работало, и я не знаю, как я могу использовать lbfgs в тензорном потоке 2.0.

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Просто добавьте немного к ответу @jdehesa - в этом случае также может быть полезно использовать tfp.math.value_and_gradient , который создаст для вас ленту градиента, если вы используете eagerРежим. Например:

import tensorflow as tf
import tensorflow_probability as tfp

ndims = 60
minimum = tf.ones([ndims], dtype="float64")
scales = tf.range(ndims, dtype="float64") + 1.0


def quadratic(x):
    value = tf.reduce_sum(scales * (x - minimum) ** 2)
    return value


start = tf.range(ndims, 0, -1, dtype="float64")

optim_results = tfp.optimizer.lbfgs_minimize(
    lambda x: tfp.math.value_and_gradient(quadratic, x),
    initial_position=start,
    num_correction_pairs=10,
    tolerance=1e-8,
)
1 голос
/ 28 октября 2019

Используйте tf.function в вашей целевой функции, чтобы она выполнялась в виде графика, тогда вы сможете использовать tf.gradients:

import tensorflow as tf
import tensorflow_probability as tfp
import numpy as np

# A high-dimensional quadratic bowl.
ndims = 60
minimum = tf.ones([ndims], dtype='float64')
scales = tf.range(ndims, dtype='float64') + 1.0

# The objective function and the gradient.
@tf.function
def quadratic(x):
    value = tf.reduce_sum(scales * (x - minimum) ** 2)
    return value, tf.gradients(value, x)[0]

start = tf.range(ndims, 0, -1, dtype='float64')
optim_results = tfp.optimizer.lbfgs_minimize(
  quadratic, initial_position=start, num_correction_pairs=10,
  tolerance=1e-8)

# Check that the search converged
print(optim_results.converged.numpy())
# True

# Check that the argmin is close to the actual value.
print(np.allclose(optim_results.position.numpy(), minimum.numpy()))
# True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...