Я пытаюсь написать собственный оптимизатор, который должен решить проблему выпуклой оптимизации. Однако из того, что я прочитал в Интернете, видно, что тензорные потоки 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" не вариант.