当前位置: 首页 > 知识库问答 >
问题:

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

萧胜
2023-03-14

在TensorFlow FAQ中,它说:

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

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

共有3个答案

鄢选
2023-03-14

在上面的回答中,它被很好地定义了。还有一些我经历过的观察,所以我想分享一下。

tf.传感器。get_shape()可用于使用创建输出的操作推断输出,这意味着我们可以不使用sess推断输出。run()(运行操作),正如名称所暗示的,static shape。例如

c=tf.随机_均匀([1,3,1,1])

是一个 tf。张量,在运行图形之前,我们想知道它在代码中的任何一步的形状,所以我们可以使用

c.get_shape()

tf.传感器的原因。get_shape不能是动态的(sess.run())是因为输出类型是TensorShape而不是tf。张量,输出TensorShape会限制sess.run()的使用。

c.get_shape())

如果这样做,我们会得到一个错误,即TensorShape的类型无效,它必须是Tensor/操作或字符串

另一方面,动态形状需要通过sess.run()运行操作来获得形状

sess.运行(tf.形状(c))

输出:数组([1,3,1,1])

或者

sess.run(c).shape

(1, 3, 1, 1) # 元组

希望有助于澄清张量流概念。

纪鸿禧
2023-03-14

Tensorflow 2.0兼容回答:提及mrry在他的回答中已经指定的代码,在< Code > tensor flow 2 . x版(

# Installing the Tensorflow Version 2.1
!pip install tensorflow==2.1

# If we don't Disable the Eager Execution, usage of Placeholder results in RunTimeError

tf.compat.v1.disable_eager_execution()

x = tf.compat.v1.placeholder(tf.int32, shape=[4])
print(x.get_shape())

# ==> 4

y, _ = tf.unique(x)
print(y.get_shape())

# ==> (None,)

sess = tf.compat.v1.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,)'

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]
范翰海
2023-03-14

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

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

x的值。get_shape()x的静态形状,(4,4)表示它是一个长度为4的向量。现在让我们应用 op到 x

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

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

希望这表明张量可以有不同的静态和动态形状。动态形状始终是完全定义的,它没有<代码>dimensions,但静态形状可能不那么具体。这使得TensorFlow能够支持tf之类的操作。unique()tf。dynamic_partition(),它可以有可变大小的输出,并在高级应用程序中使用。

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

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]
 类似资料:
  • 本文向大家介绍详解C++ 多态的两种形式(静态、动态),包括了详解C++ 多态的两种形式(静态、动态)的使用技巧和注意事项,需要的朋友参考一下 1.多态的概念与分类 多态(Polymorphisn)是面向对象程序设计(OOP)的一个重要特征。多态字面意思为多种状态。在面向对象语言中,一个接口,多种实现即为多态。C++中的多态性具体体现在编译和运行两个阶段。编译时多态是静态多态,在编译时就可以确定使

  • 问题内容: 我有一个由 N = 4000个样本 组成的数据集X ,每个样本都包含 d = 2个特征 (连续值),这些特征跨越 t = 10个时间步长 。在时间步骤11,我还具有每个样本的相应“标签”,它们也是连续值。 目前,我的数据集的形状为X:[4000,20],Y:[4000]。 给定d个功能的10个先前输入,我想使用TensorFlow训练LSTM来预测Y值(回归),但是我在TensorFl

  • 我对编码还是很陌生,所以我只是在尝试制作一些简单的游戏,比如Snake。现在,我正试图让苹果被吃掉时的轨迹沿着头部,但我遇到了一个问题。 我现在有它,这样尾巴在正确的时间在正确的地方产卵,但它们不会移动。它们产卵并静止。我的尾部片段存储在ArrayList中,我不知道如何在每个滴答声中更新矩形的坐标值。如何更改每个矩形的坐标值? 这就是我目前所拥有的。这是我的蛇类的一部分,它会产生尾巴并绘制它们

  • 问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些

  • 问题内容: 在进行Ajax调用的redux-form 函数中,Ajax中需要Redux状态的某些属性(例如,用户ID)。 这将是很容易的,如果我想定义形式的成分,只要调用:在任何我需要传递,并从阅读中我的。 但是,像一个出色的React-Redux开发人员一样,我编写了 单独的视图组件和容器 ,因此视图组件可以很简单,几乎没有行为。因此,我想 在我的container中定义handleSubmit

  • 我正在用C#开发一个窗口表单,使用数据库中的数据构建一个树视图。有一个存储过程,给出以下信息的列表 id-节点id描述-树视图中显示的值是EndNode-0,如果它是结束节点;1,如果这个节点有孩子 如果isEndNode为1,那么我必须使用当前节点的id调用相同的存储过程,以接收其下的子节点列表。 我已经建立了一个机制来调用存储过程并获取项目列表,但我不确定如何填充树结构。我想我会将第一个列表显