指定动态形状作为输入参数

Specify dynamic shape as an input argument

对于需要形状参数的张量流函数,我们如何将动态形状作为输入参数之一提供?

例如,假设我有一个占位符

x = tf.placeholder(tf.float32, [None, 3])

现在我想创建一个与 x 的第一维形状相同的一维随机张量。

r = tf.random_uniform([x.get_shape()[0]])

这将不起作用,因为 x.get_shape()[0] 将 return 静态形状 "None"。有没有一种方法可以根据 x 的动态形状将动态形状分配给 r

x = tf.placeholder(tf.float32, [None, 3])
s = tf.shape(x)
s2 = tf.slice(s, [0], [1])
r = tf.random_uniform(s2)
sess = create_session()
print r.eval(feed_dict={x:np.ones((4,3))})

[ 0.69890845 0.64149153 0.16378665 0.89732885]

您可以使用 tf.shape() op 获取张量的动态形状,并将其用作 tf.random_uniform():

的参数
x = tf.placeholder(tf.float32, [None, 3])
r = tf.random_uniform(tf.shape(x)[0:1])

(请注意 tf.shape(x) 的切片,即 [0:1] 必须指定一个范围而不是单个元素,因为 tf.random_uniform() 需要一个维度向量。)