Градиент TensorFlow из Optimizer.minimize неправильно вычисляет переменные с зависимостями
Я хотел бы использовать train_opt = tf.train.AdamOptimizer().minimize()
для проблемы, где потеря определяется данными, собранными от природы, и, следовательно, необходимо будет передать эти значения с feed_dict
параметр sess.run
,
Проблема в том, что градиент, определенный оптимизатором, неверен. Это кажется поправимым, поскольку градиент очень прост для вычисления. Проблема связана с тем, что TF не рассматривает изменение зависимой переменной.
Пожалуйста, помогите мне, чтобы я мог тренироваться на данных вместо необходимости встроенной функции TF. Я рассмотрел два возможных решения: использовать тривиальное NN для обучения моей переменной "x" (см. Фрагмент) и изменить x на a tf.trainable_variables()
, который чувствует себя немного как ядерное оружие здесь. Или переписать Адама на Python и избегать TensorFlow для такого рода проблем. Я бы предпочел решение, которое было бы более разумным и использовало TensorFlow.
В качестве примера я написал небольшой фрагмент с хорошей функцией Loss; loss = tflearn.objectives.mean_square(tf.random.normal((1,),mean=1-tf.sin(np.pi*x), stddev=1),0)
, Здесь код работает просто отлично. Но когда я заменяю потерю loss = tflearn.objectives.mean_square(y)
и обновите y с помощью c = np.random.normal(1-tf.sin(np.pi*x),1),0)
и писать sess.run(train_opt, feed_dict{y:c})
в цикле, градиент от train.Optimizer
не может видеть, что у зависит от х. Я приложил соответствующие фрагменты:
import tensorflow as tf
import tflearn
import numpy as np
### First chunk
x = tf.Variable(.8)
loss = tflearn.objectives.mean_square(tf.random.normal((1,),mean=1-tf.sin(np.pi*x), stddev=1),0)
train_op = tf.train.AdamOptimizer(.01).minimize(loss)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10000):
print(sess.run(x),sess.run(loss))
sess.run(train_op)
##
### Second chunk
x = tf.Variable(.8)
y = tf.placeholder(tf.float32)
loss = tflearn.objectives.mean_square(y+.0001*x,0)
train_op = tf.train.AdamOptimizer(.01).minimize(loss)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10000):
c = np.random.normal(1-tf.sin(np.pi*x),1)
print(sess.run(x),sess.run(loss, feed_dict={y:c}))
sess.run(train_op, feed_dict={y:c})
##
х должен сходиться к 0.5
здесь, как это происходит в "первом фрагменте" кода, но не сходится во "втором фрагменте" кода. +.0001*x
добавляется так, что код компилируется, без него Оптимизатор жалуется на отсутствие зависимой переменной, что ложно, если вы спросите силу природы, т.е. c=np.random.normal(1-tf.sin(np.pi*x),1),0)
, Важно помнить, что в первом фрагменте градиент находится с использованием данных выборки, и это все, что я пытаюсь сделать во втором фрагменте. Благодарю.