TensorFlow:生成随机常量

dan*_*451 7 python numpy initialization interactive-session tensorflow

在我的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)
Run Code Online (Sandbox Code Playgroud)

返回:

array([[-0.04152317,  0.19786302],
       [-0.68232622, -0.23439092]])
Run Code Online (Sandbox Code Playgroud)

正如预期的那样.

...但是当我使用Tensorflow正态分布函数时:

some_test = tf.constant(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32))
session.run(some_test)
Run Code Online (Sandbox Code Playgroud)

...它引发了一个类型错误说:

(...)
TypeError: List of Tensors when single Tensor expected
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

输出:

sess.run(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32))
Run Code Online (Sandbox Code Playgroud)

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

mrr*_*rry 13

tf.constant()运算需要花费numpy的阵列(或其它隐式转换为一个numpy的阵列),并返回一个tf.Tensor其值是相同的数组.它并没有接受tf.Tensor作为其参数.

另一方面,tf.random_normal()op返回a,tf.Tensor其值在每次运行时根据给定的分布随机生成.由于它返回a 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))
    
    Run Code Online (Sandbox Code Playgroud)
  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`
    
    Run Code Online (Sandbox Code Playgroud)

  • 感谢您的解释!所以当我想要GPU加速又称为"纯"张量流以获得随机"常量"时,我必须使用`tf.Variable`? (2认同)