Оптимизация внутри оптимизатора - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь написать собственный оптимизатор, который должен решить проблему выпуклой оптимизации. Однако из того, что я прочитал в Интернете, видно, что тензорные потоки while_loop, которые я собирался использовать для решения задачи выпуклой оптимизации, не могут вычислять градиенты на основе входных данных, а только на основе переменных, определенных внутри while_loop.

First ofвсе, это правильно, или я могу вычислить градиент внутри tenorflow. while_loop на основе потерь и параметров, заданных в качестве входных данных для цикла? Если это не так, как бы я поступил так? Можно ли перестроить весь вычислительный граф внутри цикла на основе ввода?

Следующий фрагмент кода является примером кода того, что будет внутри моего оптимизатора.

x = K.variable(x_val,dtype='float32',name='x')
loss = (x-5)**2

def cond(xp,x,loss,i):
    return tf.logical_and( K.sum((x-xp)**2)>0.001, i<100)

def body(xp,x,loss,i):
    g = K.gradients(loss,x)
    g2 = K.gradients(g,x)
    g_temp = g[0]/g2[0]
    g_temp = tf.where(tf.is_nan(g_temp), tf.zeros_like(g_temp), g_temp)
    x_n = x-g_temp
    return x,x_n,loss,i+1


prev_x,x,g_temp,i = tf.while_loop(cond , body, [np.inf,x,loss,0] )

Ошибка Iget is: "AttributeError: объект 'NoneType' не имеет атрибута 'op'"

Это происходит при расчете градиентов (при условии, что потеря и x стали неассоциированными и, таким образом, x больше не является частью потериследовательно, вывод 'None')

ПРИМЕЧАНИЕ, потеря - это всего лишь фиктивная потеря, поэтому "просто решение для x" не вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...