Python tf.shape()在tensorflow中获取错误的形状

Python tf.shape()在tensorflow中获取错误的形状,python,python-3.x,tensorflow,tensor,Python,Python 3.x,Tensorflow,Tensor,我定义的张量如下: x=tf.get_变量(“x”,[100]) 但当我尝试打印张量的形状时: 打印(tf.shape(x)) 我得到了张量(“Shape:0”,Shape=(1,),dtype=int32),为什么输出结果不应该是Shape=(100)返回一个表示输入形状的一维整数张量 您正在查找:x.get_shape(),它返回x变量的TensorShape 更新:我写了一篇文章来澄清Tensorflow中的动态/静态形状,因为这个答案:澄清: shape(x)创建一个op并返回一个对象,

我定义的张量如下:

x=tf.get_变量(“x”,[100])

但当我尝试打印张量的形状时:

打印(tf.shape(x))

我得到了张量(“Shape:0”,Shape=(1,),dtype=int32),为什么输出结果不应该是Shape=(100)

返回一个表示输入形状的一维整数张量

您正在查找:
x.get_shape()
,它返回
x
变量的
TensorShape

更新:我写了一篇文章来澄清Tensorflow中的动态/静态形状,因为这个答案:

澄清:

shape(x)创建一个op并返回一个对象,该对象代表构建的op的输出,这就是您当前正在打印的对象。要获取形状,请在会话中运行该操作:

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]
a = tf.Variable(tf.zeros(shape=(2, 3, 4)))
with tf.Session() as sess:
    print sess.run(tf.shape(a))

信用证:在看了上面的答案后,我看到了我觉得更有用的答案,我试着在这里重新措辞。

类似的问题在以下章节中得到了很好的解释:

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

因此,返回一个张量,其大小始终为
shape=(N,)
,可以在会话中计算:

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]
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()
提取静态形状,这可以在任何地方进行计算。

这只是一个简单的示例,让事情更清楚:

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)
这也应该有帮助:

简单地说,使用
张量.shape
获得静态形状:

而要获得动态形状,请使用
tf.shape()


您还可以使用
您的_tensor.shape
获得NumPy中的形状,如下例所示

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())
x.get\u shape().as\u list()
是将形状转换为标准python列表的常用形式。我发现这个答案对于分析张量的形状非常有用,尽管它不是公认的。什么是
shape=(N,)
表示?当静态形状和dinamic形状不同时,您能举例说明吗?@mrglud shape=(n,)表示大小为n的向量。显示这样的示例并不容易,因为您需要将TF混淆到足以失去对形状的控制