Tensorflow: генерировать ввод для получения желаемого результата - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь применить градиентный спуск к входной переменной в моей модели TF, чтобы модель вывела произвольное значение.Сначала я обучаю модель реальным данным, а затем генерирую случайный массив, чтобы получить прогноз из модели.Затем я вычисляю градиенты для этого ввода и, наконец, пытаюсь применить алгоритм оптимизации исключительно к этому, оставляя саму модель нетронутой.Этот последний шаг, где я застрял.

Я новичок в Tensorflow, и я не смог найти другие примеры этого приложения онлайн.

Вот код, который воспроизводит мой метод и полученную ошибку (когда строка 37 не закомментирована).

import tensorflow as tf
import numpy as np

def some_op(x):
    return 0.8 * x

epochs = 5
batch_size = 8
x_shape1 = 6
y_shape1 = 1

is_training = tf.placeholder(tf.bool, name='is_training')
x = tf.placeholder(tf.float32, [None, x_shape1], name='X')
x_var = tf.Variable(0.)

y = tf.placeholder(tf.float32, [None, y_shape1], name='Y')

with tf.name_scope('ops'):
    # trainable input
    input_var = tf.assign(x_var, x, validate_shape=False, name='input_tensor')

    # NN
    X = tf.layers.dense(input_var, 8, name='dense1', reuse=tf.AUTO_REUSE)
    X = tf.layers.dropout(X, 0.5)
    X = tf.layers.dense(X, 16, name='dense2', reuse=tf.AUTO_REUSE)
    X = tf.layers.dropout(X, 0.5)
    X = tf.layers.dense(X, 4, name='dense3', reuse=tf.AUTO_REUSE)
    output = tf.layers.dense(X, y_shape1, name='output', reuse=tf.AUTO_REUSE)

    with tf.name_scope('loss'):
        loss = tf.sqrt(tf.reduce_mean(tf.square(tf.subtract(y, output))))

        update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
        with tf.control_dependencies(update_ops):
            optimizer = tf.train.AdamOptimizer(0.01)
            do_optimization = optimizer.minimize(loss)

            grads_and_vars = optimizer.compute_gradients(loss, var_list=[input_var])
            my_grads_and_vars = [(some_op(gv[0]), gv[1]) for gv in grads_and_vars]
            # apply_grad = optimizer.apply_gradients(my_grads_and_vars) # uncomment here

sess = tf.Session()
sess.run(tf.global_variables_initializer())

# train model
for e in range(epochs):
    random_input = np.random.normal(size=[batch_size, x_shape1]) * np.arange(1, 7)
    random_y = np.random.uniform(size=[batch_size, y_shape1]) * 8
    loss_, _ = sess.run([loss, do_optimization], feed_dict={x: random_input, y: random_y, is_training: True})
    print("Epoch", e, "loss", loss_)

# generate desired input
gen_random_input = np.random.uniform(size=[1, x_shape1])
desired_y = [[8]]

input_grad = sess.run(grads_and_vars, feed_dict={x: gen_random_input, y: desired_y, is_training: False})

Когда вы раскомментируете строку 37, вот что вы получите:

ValueError: Input 'ref' passed float expected ref type while building NodeDef 'ops/input_tensor/Adam/ops/input_tensor_ops/input_tensor/Adam_0' using Op<name=Assign; signature=ref:Ref(T), value:T -> output_ref:Ref(T); attr=T:type; attr=validate_shape:bool,default=true; attr=use_locking:bool,default=true; allows_uninitialized_input=true>

Кто-нибудь сталкивался с этой проблемой раньше?

...