如何在TensorFlow中了解静态形状和动态形状?
tensorflow
5
0

TensorFlow FAQ中 ,它说:

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

但是我仍然不能完全理解静态形状和动态形状之间的关系。是否有任何例子表明它们之间的差异?谢谢。

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

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

x = tf.placeholder(tf.int32, shape=[4])
print x.get_shape()
# ==> '(4,)'

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

y, _ = tf.unique(x)
print y.get_shape()
# ==> '(?,)'

(?,)表示y是未知长度的向量。为什么未知? tf.unique(x)从返回唯一值x和值x是未知的,因为它是一个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,)'

希望这可以使张量可以具有不同的静态和动态形状。动态形状总是完全定义的-它没有?尺寸-但静态形状可能不太具体。这就是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]
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号