如何将潜在变量输入 TensorFlow 图中?
How does one feed latent variables into a TensorFlow graph?
我想使用 TensorFlow 训练一些潜在的(直到 运行 时间才可用)变量。我收到以下错误:"ValueError: setting an array element with a sequence."
如果我用常数值初始化 'a',我可以获得预期的结果,但我的应用程序不允许 'a' 的值直到 运行 时间才知道,并且我打算在它们可用后使用梯度下降来改进它们。看起来 'placeholder' 提供了这个功能,但我显然需要一些帮助才能正确使用它们。我想知道将潜在变量输入 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: 使用序列设置数组元素。
试试这个:
feed_dict = {a: np.array([[2.],[3.]])}
你不能喂 variables/tensors。相反,您可以先评估变量的值,然后将其提供给占位符。
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.]]
您可以做两件事。您可以从占位符初始化变量,并将其初始化为提供给该占位符的值。
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)
我想使用 TensorFlow 训练一些潜在的(直到 运行 时间才可用)变量。我收到以下错误:"ValueError: setting an array element with a sequence."
如果我用常数值初始化 'a',我可以获得预期的结果,但我的应用程序不允许 'a' 的值直到 运行 时间才知道,并且我打算在它们可用后使用梯度下降来改进它们。看起来 'placeholder' 提供了这个功能,但我显然需要一些帮助才能正确使用它们。我想知道将潜在变量输入 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: 使用序列设置数组元素。
试试这个:
feed_dict = {a: np.array([[2.],[3.]])}
你不能喂 variables/tensors。相反,您可以先评估变量的值,然后将其提供给占位符。
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.]]
您可以做两件事。您可以从占位符初始化变量,并将其初始化为提供给该占位符的值。
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)