如何理解TensorFlow中的静态形状和动态形状?

Lif*_*ang 45 tensorflow

TensorFlow FAQ中,它说:

在TensorFlow中,张量具有静态(推断)形状和动态(真实)形状.静态形状可以使用tf.Tensor.get_shape()方法被读取:该形状是从被用来创建该张量的操作推断出,并且可以是部分完成.如果静态形状没有完全定义,则可以通过评估tf.shape(t)来确定Tensor t的动态形状.

但我仍然无法完全理解静态形状和动态形状之间的关系.是否有任何显示其差异的例子?谢谢.

mrr*_*rry 72

有时,张量的形状取决于在运行时计算的值.让我们看下面的例子,其中x定义为一个tf.placeholder()包含四个元素的向量:

x = tf.placeholder(tf.int32, shape=[4])
print x.get_shape()
# ==> '(4,)'
Run Code Online (Sandbox Code Playgroud)

x.get_shape()的静态形状是x,并且(4,)表示它是长度为4的向量.现在让我们将tf.unique()op应用于x

y, _ = tf.unique(x)
print y.get_shape()
# ==> '(?,)'
Run Code Online (Sandbox Code Playgroud)

(?,)装置,其y是未知长度的向量.为什么不知道?tf.unique(x)返回唯一值x,并且值x是未知的,因为它是a tf.placeholder(),因此在您提供它之前它没有值.让我们看看如果你提供两个不同的值会发生什么:

sess = tf.Session()
print sess.run(y, feed_dict={x: [0, 1, 2, 3]}).shape
# ==> '(4,)'
print sess.run(y, feed_dict={x: [0, 0, 0, 0]}).shape
# ==> '(1,)'
Run Code Online (Sandbox Code Playgroud)

希望这表明张量可以具有不同的静态和动态形状.动态形状始终是完全定义的 - 它没有?尺寸 - 但静态形状可能不太具体.这使得TensorFlow能够支持像tf.unique()和那样tf.dynamic_partition()可以具有可变大小输出的操作,并且可以在高级应用程序中使用.

最后,tf.shape()op可用于获取张量的动态形状并在TensorFlow计算中使用它:

z = tf.shape(y)
print sess.run(z, feed_dict={x: [0, 1, 2, 3]})
# ==> [4]
print sess.run(z, feed_dict={x: [0, 0, 0, 0]})
# ==> [1]
Run Code Online (Sandbox Code Playgroud)

  • 通常,可学习参数的形状需要静态知道,但输入可具有可变批量大小. (5认同)