Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何理解TensorFlow中的静态形状和动态形状?_Tensorflow - Fatal编程技术网

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

如何理解TensorFlow中的静态形状和动态形状?,tensorflow,Tensorflow,在这方面,它说: 在TensorFlow中,张量既有静态(推断)形状,也有静态形状 动态(真实)形状。可以使用 get_shape()方法:此形状是从 用于创建张量的操作,可以部分 完成如果静态形状未完全定义,则动态形状 张量t的形状可以通过计算tf.shape(t)来确定 但我仍然不能完全理解静态形状和动态形状之间的关系。是否有任何例子表明他们的不同?谢谢。有时张量的形状取决于运行时计算的值。让我们以下面的示例为例,其中x被定义为具有四个元素的向量: x = tf.placeholder(tf

在这方面,它说:

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


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

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

x = tf.placeholder(tf.int32, shape=[4])
print x.get_shape()
# ==> '(4,)'
x.get_shape()
的值是
x
的静态形状,
(4,
)表示它是长度为4的向量。现在让我们将op应用于
x

y, _ = tf.unique(x)
print y.get_shape()
# ==> '(?,)'
(?,)
表示
y
是长度未知的向量。为什么不知道?从
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()
和之类的操作,这些操作可以具有可变大小的输出,并用于高级应用程序中

最后,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]
这是一张示意图,显示了以下两个方面:

在上面的答案中定义得很好,我们对此投了赞成票。我还经历了一些观察,所以我想与大家分享

tf.Tensor.get_shape()可用于使用创建输出的操作推断输出,这意味着我们可以在不使用sess.run()的情况下推断输出(运行操作),正如名称static shape所暗示的那样。 比如说,

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

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

c、 get_shape()

tf.Tensor.get_shape无法动态(sess.run())的原因是输出类型 TensorShape而不是tf.tensor,输出TensorShape会限制sess.run()的使用

sess.run(c.get_shape())

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

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

分段运行(tf形状(c))

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

赛斯·润(c)·形

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


希望这有助于澄清tensorflow的概念。

tensorflow 2.0兼容答案:为了社区的利益,提及mrry在其答案中指定的代码

# 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]

我可以使用具有可学习层的动态形状吗?如果使用较小的输入,权重会发生什么变化?通常,可学习参数的形状需要静态已知,但输入可以具有可变的批量大小。有没有办法在tensorflow 2.0和tf.keras中具有推断形状和动态形状