Как подать скрытые переменные в граф TensorFlow? - PullRequest
2 голосов
/ 18 апреля 2019

Я хочу использовать TensorFlow для обучения некоторых скрытых (недоступных до времени выполнения) переменных.Я получаю следующую ошибку: «ValueError: установка элемента массива с последовательностью.»

Я могу получить ожидаемые результаты, если я инициализирую «a» постоянными значениями, но мое приложение не допускает значения«а» будет известно до времени выполнения, и я намерен использовать градиентный спуск, чтобы уточнить их после того, как они станут доступны.Похоже, «заполнитель» обеспечивает эту функциональность, но мне, видимо, нужна некоторая помощь для их правильного использования.Я хочу знать правильный способ подачи скрытых переменных в график TensorFlow.Вот упрощенное воспроизведение:

import tensorflow as tf
import numpy as np

a = tf.placeholder(tf.float64, [2, 1])
b = tf.Variable(np.array([[1., 3.]]))
c = tf.matmul(a, b)

latent = tf.Variable(np.array([[2.],[3.]]))

init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    print(sess.run(c, feed_dict={a: latent}))

Ожидаемые результаты: [[2. 6.] [3. 9.]]

Фактические результаты: ValueError: установка элемента массива с последовательностью.

Ответы [ 2 ]

3 голосов
/ 18 апреля 2019

Есть две вещи, которые вы можете сделать.Вы можете инициализировать переменную из заполнителя и инициализировать ее значением, переданным этому заполнителю.

import tensorflow as tf

latent_init_val = tf.placeholder(tf.float64, [1, 2])
latent = tf.Variable(latent_init_val)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op, feed_dict={latent_init_val: [[2., 3.]]})

Или вы можете просто использовать load метод переменной для установкиего значение без использования каких-либо дополнительных объектов.

import tensorflow as tf

# Initial value only matters for shape here
latent = tf.Variable([[0., 0.]], dtype=tf.float64)
with tf.Session() as sess:
    latent.load([[2., 3.]], sess)
1 голос
/ 18 апреля 2019

Попробуйте вместо этого:

feed_dict = {a: np.array([[2.],[3.]])}

Вы не можете кормить переменные / тензоры.Вместо этого вы могли бы сначала оценить значение переменной, а затем передать его заполнителю.

import tensorflow as tf
import numpy as np

a = tf.placeholder(tf.float64, [2, 1])
b = tf.Variable(np.array([[1., 3.]]))
c = tf.matmul(a, b)

latent = tf.Variable(np.array([[2.],[3.]]))
init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init_op)
    latent_val = latent.eval() # <-- evaluate the value of the variable
    print(sess.run(c, feed_dict={a: latent_val}))
    # [[2. 6.]
    #  [3. 9.]]
...