我定义了一个这样的张量:
x = tf.get_variable("x", [100])
但是当我尝试打印张量的形状时:
print( tf.shape(x) )
我得到Tensor("Shape:0", shape=(1,), dtype=int32),为什么输出的结果不应该是 shape=(100)
我定义了一个这样的张量:
x = tf.get_variable("x", [100])
但是当我尝试打印张量的形状时:
print( tf.shape(x) )
我得到Tensor("Shape:0", shape=(1,), dtype=int32),为什么输出的结果不应该是 shape=(100)
tf.shape(input, name=None)返回一个表示输入形状的一维整数张量。
您正在寻找:x.get_shape()
返回变量TensorShape
的。x
更新:由于这个答案,我写了一篇文章来阐明 Tensorflow 中的动态/静态形状:https ://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/
澄清:
tf.shape(x) 创建一个操作并返回一个代表构造操作的输出的对象,这就是您当前正在打印的内容。要获取形状,请在会话中运行操作:
matA = tf.constant([[7, 8], [9, 10]])
shapeOp = tf.shape(matA)
print(shapeOp) #Tensor("Shape:0", shape=(2,), dtype=int32)
with tf.Session() as sess:
print(sess.run(shapeOp)) #[2 2]
学分:看了上面的答案后,我在 Tensorflow 中看到了 tf.rank 函数的答案,我发现它更有帮助,我在这里尝试改写它。
只是一个简单的例子,让事情变得清楚:
a = tf.Variable(tf.zeros(shape=(2, 3, 4)))
print('-'*60)
print("v1", tf.shape(a))
print('-'*60)
print("v2", a.get_shape())
print('-'*60)
with tf.Session() as sess:
print("v3", sess.run(tf.shape(a)))
print('-'*60)
print("v4",a.shape)
输出将是:
------------------------------------------------------------
v1 Tensor("Shape:0", shape=(3,), dtype=int32)
------------------------------------------------------------
v2 (2, 3, 4)
------------------------------------------------------------
v3 [2 3 4]
------------------------------------------------------------
v4 (2, 3, 4)
这也应该有帮助: 如何理解 TensorFlow 中的静态形状和动态形状?
TF FAQ很好地解释了类似的问题:
在 TensorFlow 中,张量具有静态(推断)形状和动态(真实)形状。可以使用该
tf.Tensor.get_shape
方法读取静态形状:此形状是从用于创建张量的操作中推断出来的,并且可能是部分完整的。如果静态形状没有完全定义,则可以通过评估来确定张量 t 的动态形状tf.shape(t)
。
因此tf.shape()
返回一个张量,其大小始终为shape=(N,)
,并且可以在会话中计算:
a = tf.Variable(tf.zeros(shape=(2, 3, 4)))
with tf.Session() as sess:
print sess.run(tf.shape(a))
另一方面,您可以使用提取静态形状x.get_shape().as_list()
,这可以在任何地方计算。
简单地说,用于tensor.shape
获取静态形状:
In [102]: a = tf.placeholder(tf.float32, [None, 128])
# returns [None, 128]
In [103]: a.shape.as_list()
Out[103]: [None, 128]
而要获得动态形状,请使用tf.shape()
:
dynamic_shape = tf.shape(a)
您还可以像在 NumPy 中your_tensor.shape
一样获取形状,如下例所示。
In [11]: tensr = tf.constant([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]])
In [12]: tensr.shape
Out[12]: TensorShape([Dimension(2), Dimension(5)])
In [13]: list(tensr.shape)
Out[13]: [Dimension(2), Dimension(5)]
In [16]: print(tensr.shape)
(2, 5)
同样,这个例子,对于可以使用的张量eval
。
In [33]: tf.shape(tensr).eval().tolist()
Out[33]: [2, 5]
Tensorflow 2.0 兼容答案:Tensorflow 2.x (>= 2.0)
nessuno 解决方案的兼容答案如下所示:
x = tf.compat.v1.get_variable("x", [100])
print(x.get_shape())