#python #numpy #tensorflow #optimization #scipy
#python #numpy #tensorflow #оптимизация #scipy
Вопрос:
У меня есть квантованная 2D-карта значений функций, функции которой я не знаю. Я хочу найти непрерывную позицию минимума этой карты.
Я могу сделать это легко с помощью scipy
, но я хотел бы использовать TensorFlow для этого, потому что на самом деле у меня есть очень сложный вычислительный график, который я хотел бы вывести автоматически, который работает как шарм, используя TF. Это требует в основном сочетания численных и аналитических вычислений градиента.
Далее вы найдете очень маленький пример в виде функции Розенброка, фиксирующей часть, которую я не могу выразить в TF, но в scipy
.
Используя scipy:
import tensorflow as tf
import numpy as np
from scipy.ndimage import map_coordinates
from scipy.optimize import minimize
xx, yy = np.meshgrid(np.linspace(-2., 2., 1000),
np.linspace(-3., 1., 1000))
x0 = np.array([-1.5, -.5])
origin = np.array([-2, -3])
spacing = np.array([4. / 1000, 4. / 1000])
# the quantized function I want to minimize, can be anything
rosenbrock = ((1 - xx)**2 100*(yy - xx**2)**2).T
# it is NOT that simple ;)
print('Quantized min at: ',
spacing * np.unravel_index(np.argmin(rosenbrock), rosenbrock.shape)
origin)
def rosen(x):
idx = ((x - origin) / spacing).reshape(1, 2)
return map_coordinates(rosenbrock, idx.T)
rosenbrock_grad0, rosenbrock_grad1 = np.gradient(rosenbrock)
def rosen_der(x):
idx = ((x - origin) / spacing).reshape(1, 2)
return np.array([map_coordinates(rosenbrock_grad0, idx.T)[0],
map_coordinates(rosenbrock_grad1, idx.T)[0]])
res = minimize(rosen, x0, method='BFGS', jac=rosen_der, options={'disp': True})
print('Print continuous BFGS result:', res)
Но как использовать tensorflow?
x_tf = tf.Variable(x0)
idx_tf = (x_tf - origin) / spacing
# how to express this as an OP where I can supply gradients
# in form a numerical derivatives?
f_tf = ???
opt_tf = tf.train.AdamOptimizer().minimize(f_tf)
with tf.Session() as session:
for i in range(100):
session.run(opt_tf)
print('%i: f=%f x=%s' % (i 1, session.run(f_tf), session.run(x_tf)))
Комментарии:
1. Я не совсем понимаю ваш вопрос, но, возможно, вы ищете tensorflow.org/api_docs/python/tf/gradients ?