Как вводить скрытые переменные в график тензорного потока?

#python #variables #tensorflow #placeholder

#python #переменные #тензорный поток #плейсхолдер

Вопрос:

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

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

 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.]]

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

Ответ №1:

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

 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. не знал о нагрузке, 1

Ответ №2:

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

 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.]]
 

Комментарии:

1. Да, это дает ожидаемые результаты. К сожалению, это также делает скрытые не поддающиеся обучению.

2. Вы правы, пропустили эту часть своего вопроса. Обновлено только сейчас, чтобы сохранить latent как переменную