【问题标题】:How to generate a static random constant in Tensorflow?如何在 Tensorflow 中生成静态随机常数?
【发布时间】:2019-06-24 12:03:51
【问题描述】:

我想在Tensorflow中生成一个常量张量,它会用指定的机制初始化,例如random_uniform、random_normal。

我知道我可以根据这些机制生成一个随机的numpy数组,比如random_uniform、random_normal等;然后我们将生成的 numpy 数组作为 tf.constant 中的值参数提供。

但是,问题是我们在使用 numpy 版本的随机机制时必须给出一个形状。不过我不想预先指定形状,希望形状有弹性,就像我们写Tensorflow代码shape = tf.shape(some_previous_tensor)

Way1 我试过了:在图的构建阶段不需要预先指定常量的具体形状。然而,生成的张量是随机的而不是静态的。这不是我所期望的。

var = tf.random.normal(
    [2,2], mean=0.0, stddev=0.5, dtype=tf.float32, 
)

with tf.Session() as sess:
    print('var:', sess.run(var))
    print('var:', sess.run(var))

Output:
 var: [[ 0.21260215  0.13721827]
 [ 0.7704196  -0.48304045]]

var: [[-0.63397115 -0.0956466 ]
 [ 0.0761982   0.54037064]]

Way2 我试过了:我可以得到静态常量,但是需要在 np.random.normal 中给出一个大小,这不是我所期望的。

var_np = np.random.normal(0,0.5, size=(2,2))
var = tf.constant(value=var_np)

with tf.Session() as sess:
    print('var:', sess.run(var))
    print('var:', sess.run(var))

Output:
var: [[-0.73357953 -0.10277695]
 [ 0.57406473  0.32157612]]
var: [[-0.73357953 -0.10277695]
 [ 0.57406473  0.32157612]]

【问题讨论】:

    标签: python numpy tensorflow


    【解决方案1】:

    您可以将tf.Variable / tf.get_variabletrainable=Falsevalidate_shape=False 一起使用。您可以使用取决于形状占位符的值作为初始值。然后,当您初始化变量时(使用initializer 属性或更常见的tf.global_variables_initializer 属性),您只需提供初始化形状。初始化后,变量的值将在整个会话中保持不变,只要它没有再次初始化或分配不同的值。

    import tensorflow as tf
    
    shape = tf.placeholder(tf.int32, [None])
    var_init = tf.random.normal(
        shape, mean=0.0, stddev=0.5, dtype=tf.float32, 
    )
    var = tf.Variable(var_init, validate_shape=False, trainable=False, name='Var')
    with tf.Session() as sess:
        tf.random.set_random_seed(0)
        sess.run(var.initializer, feed_dict={shape: [2, 3]})
        print('var:', sess.run(var), sep='\n')
        print('var:', sess.run(var), sep='\n')
    

    输出:

    var:
    [[-0.4055751   0.7597851  -0.04810145]
     [ 0.92776746 -0.3747548  -0.03715562]]
    var:
    [[-0.4055751   0.7597851  -0.04810145]
     [ 0.92776746 -0.3747548  -0.03715562]]
    

    【讨论】:

      【解决方案2】:

      只需运行 tf.shape(t) 以获取张量 t,您希望静态随机张量的形状。将输出值作为size 参数提供给np.random.normal,一切就绪。

      【讨论】:

      • 我写的代码会放到图构建文件中。当我们在测试阶段,我们只调用一次图构建文件,我们无法将sess.run(tf.shape(t)) 每次完成的数据的真实形状传递给图构建部分。还有其他简洁的方法吗?
      猜你喜欢
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2017-09-07
      • 2018-07-28
      相关资源
      最近更新 更多