python variable shape 不匹配_python-tf.shape()在数十个错误的形状

在TensorFlow中,tf.shape(x)返回的是一个表示张量x形状的操作对象,而非实际的形状值。要获取张量的静态形状,可以使用x.get_shape()。在会话中运行tf.shape(x)才能获取动态形状。文章讨论了静态形状与动态形状的区别,并提供了多个示例来说明。
摘要由CSDN通过智能技术生成

python-tf.shape()在数十个错误的形状

我定义这样的张量:

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

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

print( tf.shape(x) )

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

5个解决方案

118 votes

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

您正在寻找:x.get_shape(),该函数返回x变量的TensorShape。

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

nessuno answered 2019-11-18T18:36:09Z

11 votes

澄清:

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函数的答案,我发现它的帮助更大,我尝试在此处改写。

Lazar Valkov answered 2019-11-18T18:36:42Z

6 votes

简要说明一下:

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中了解静态形状和动态形状?

mrgloom answered 2019-11-18T18:37:14Z

3 votes

TF常见问题很好地解释了类似的问题:

在TensorFlow中,张量既具有静态(推断)形状,又具有   动态(真实)形状。 静态形状可以使用   x.get_shape().as_list()方法:从操作中推断出此形状   用于创建张量的元素,并且可能是部分完成的。 如果   静态形状未完全定义,张量t的动态形状   可以通过评估tf.shape(t)来确定。

因此x.get_shape().as_list()会返回一个张量,其大小始终为x.get_shape().as_list(),并且可以在会话中进行计算:

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()提取静态形状,并且可以在任何位置进行计算。

Salvador Dali answered 2019-11-18T18:37:59Z

2 votes

只需使用eval获得静态形状:

In [102]: a = tf.placeholder(tf.float32, [None, 128])

# returns [None, 128]

In [103]: a.shape.as_list()

Out[103]: [None, 128]

而要获得动态形状,请使用eval:

dynamic_shape = tf.shape(a)

您还可以像在NumPy中使用eval获得形状一样,如以下示例所示。

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)

同样,此示例适用于张量为evalu的张量。

In [33]: tf.shape(tensr).eval().tolist()

Out[33]: [2, 5]

kmario23 answered 2019-11-18T18:38:43Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值