如何在张量流中生成静态随机常数



我想在张力流中生成一个常数张量,该张量将使用指定的机制初始化,例如,random_ouriform,andural_normal。

我知道我可以根据这些机制生成一个随机的numpy阵列,例如Random_uriform,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]]

您可以将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]]

只需运行 tf.shape(t)的张量t,其形状您希望您的静态随机张量为。将输出值作为size参数馈送到np.random.normal,您都设置了。

最新更新