TensorFlow:生成随机常数

8
在ipython中,我导入了tensorflow as tfnumpy 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))

单独使用 alone 会生成与 np.random.normal 相同的结果,即从正态分布中取值,生成一个形状为 (2, 2) 的矩阵。

1个回答

17
tf.constant()操作接受一个NumPy数组(或可以隐式转换为NumPy数组的内容),并返回一个值与该数组相同的tf.Tensor。它不接受tf.Tensor作为其参数。
另一方面,tf.random_normal()操作返回一个按照给定分布随机生成的tf.Tensor值,每次运行时都是不同的。由于它返回一个tf.Tensor,因此不能用作tf.constant()的参数。这就解释了TypeError的原因(与使用tf.InteractiveSession无关,因为它发生在构建图时)。
我假设您想要在图中包含一个张量,(i)它在第一次使用时是随机生成的,之后(ii)保持不变。有两种方法可以实现这个目标:
1. 使用NumPy生成随机值,并将其放入tf.constant()中,就像你在问题中所做的那样:
some_test = tf.constant(
    np.random.normal(loc=0.0, scale=1.0, size=(2, 2)).astype(np.float32))
(Potentially faster, as it can use the GPU to generate the random numbers) 使用 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`

2
谢谢解释!所以当我想要GPU加速,也就是“纯”TensorFlow来获取一个随机的“常量”时,我必须使用tf.Variable - daniel451
是的,这很反直觉,不是吗? :) 问题实际上在于,在TF中,“is variable”和“is initializable”的概念被合并到了同一类型中 - 我们偶尔讨论过更好的初始化方式(例如C语言类似的静态初始化的等效方式),但尚未确定设计。 (人们可以想象这样的事情对于像常量折叠等优化非常有用。) - mrry
1
感谢您的回复@mrry。如果我想做同样的事情,但是我不想在此之后保持some_test常量,那么我是否应该像选项2一样做,但不包括sess.run(some_test.initializer) - bnorm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接