在ipython中,我导入了tensorflow as tf
和numpy as np
并创建了TensorFlow InteractiveSession
。
当我使用numpy输入运行或初始化一些正常分布时,一切运行正常:
some_test = tf.constant(np.random.normal(loc=0.0, scale=1.0, size=(2, 2)))
session.run(some_test)
返回:
array([[-0.04152317, 0.19786302],
[-0.68232622, -0.23439092]])
正如预期的那样。
...但是当我使用Tensorflow正态分布函数时:
some_test = tf.constant(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32))
session.run(some_test)
...它引发了一个类型错误:
(...)
TypeError: List of Tensors when single Tensor expected
我在这里缺少什么?
输出:
sess.run(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32))
单独返回np.random.normal
生成的完全相同的内容 - >形状(2, 2)
的矩阵,其值取自正态分布。
答案 0 :(得分:10)
tf.constant()
op采用一个numpy数组(或隐式转换为numpy数组的东西),并返回一个tf.Tensor
,其值与该数组相同。它不接受tf.Tensor
作为其参数。
另一方面,tf.random_normal()
op返回tf.Tensor
,其值在每次运行时根据给定的分布随机生成。由于它返回tf.Tensor
,因此不能将其用作tf.constant()
的参数。这解释了TypeError
(与使用tf.InteractiveSession
无关,因为它是在您构建图表时发生的。)
我假设您希望图表包含一个张量,其中(i)在第一次使用时随机生成,(ii)此后不变。有两种方法可以做到这一点:
使用NumPy生成随机值并将其放入tf.constant()
,就像您在问题中所做的那样:
some_test = tf.constant(
np.random.normal(loc=0.0, scale=1.0, size=(2, 2)).astype(np.float32))
(可能更快,因为它可以使用GPU生成随机数)使用TensorFlow生成随机值并将其放入tf.Variable
:
some_test = tf.Variable(
tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32)
sess.run(some_test.initializer) # Must run this before using `some_test`