#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
как переменную