TensorFlow:生成随机常数

TensorFlow: generating a random constant

在 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)

Returns:

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))

单独 returns 与 np.random.normal 生成的完全相同的东西 -> 形状为 (2, 2) 的矩阵,其值取自正态分布。

与那个数组的值相同的tf.constant() op takes a numpy array (or something implicitly convertible to a numpy array), and returns a tf.Tensor。它接受tf.Tensor作为它的参数。

另一方面,tf.random_normal() op returns a tf.Tensor 其值是每次运行时根据给定分布随机生成的。由于它 returns 一个 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))
    
  2. (可能更快,因为它可以使用 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`