Градиент 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), Важно помнить, что в первом фрагменте градиент находится с использованием данных выборки, и это все, что я пытаюсь сделать во втором фрагменте. Благодарю.

0 ответов

Другие вопросы по тегам