tf.shape()在张量流中得到错误的形状
python
python-3.x
tensor
tensorflow
6
0

我定义这样的张量:

x = tf.get_variable("x", [100])

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

print( tf.shape(x) )

我得到Tensor(“ Shape:0”,shape =(1,),dtype = int32) ,为什么输出结果不应为shape =(100)

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

只需使用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)

您还可以使用your_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]
收藏
评论

tf.shape(input,name = None)返回表示输入形状的一维整数张量。

您在寻找: x.get_shape()返回x变量的TensorShape

更新:由于这个答案,我写了一篇文章来澄清Tensorflow中的动态/静态形状: https ://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/

收藏
评论

澄清:

tf.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]

信用:看了上面的答案之后,我在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中,张量既具有静态(推断)形状又具有动态(true)形状。可以使用tf.Tensor.get_shape方法读取静态形状:此形状是从用于创建张量的操作中推断出来的,并且可以部分完成。如果静态形状没有完全定义,则可以通过评估tf.shape(t)确定张量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()提取静态形状,并且可以在任何位置进行计算。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号