我想在Tensorflow中生成一个常数张量,将使用指定的机制(例如random_uniform,random_normal)进行初始化。
我知道我可以根据这些机制生成一个随机的numpy数组,例如random_uniform,random_normal等;然后,将生成的numpy数组作为值参数输入tf.constant。
但是,问题是当使用numpy版本的随机机制时,我们必须给出形状。但是,我不想预先指定形状,而是希望形状具有弹性,就像我们编写Tensorflow代码shape = tf.shape(some_previous_tensor)
方法1我尝试过:不必在图形构建阶段预先指定常量的具体形状。但是,生成的张量是随机的,而不是静态的。那不是我所期望的。
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]]
我尝试的方式2:我可以获取静态常量,但是有必要在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]]
答案 0 :(得分:1)
您可以将tf.Variable
/ tf.get_variable
与trainable=False
和validate_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]]
答案 1 :(得分:0)
只需运行tf.shape(t)
的张量t
,其形状就是您想要的静态随机张量。将输出值作为size
的参数输入到np.random.normal
,就一切都准备好了。