TypeError:“ TensorShape”对象不可调用

时间:2018-08-23 01:32:17

标签: tensorflow

我是Tensorflow编程的新手,我正在挖掘一些函数,并在代码段中出现此错误:

**with** **tf.Session()** as sess_1:
c = tf.constant(5)
d = tf.constant(6)
e = c + d
print(sess_1.run(e))
print(sess_1.run(e.shape()))

发现错误:跟踪(最近一次通话过去):   文件“ C:/Users/Ashu/PycharmProjects/untitled/Bored.py”,第15行     打印(sess_1.run(e.shape())) TypeError:“ TensorShape”对象不可调用

我在这里没有找到它,所以任何人都可以澄清这个愚蠢的疑问,因为我是新学习者。对于任何键入错误,我们深表歉意!

我还有一个疑问,当我只使用eval()函数时,它不会在pycharm中打印任何内容,我不得不将它与print()方法一起使用。所以我的疑问是,当使用print()方法时,它不会打印张量的dtype,而只是在pycharm中打印张量或python对象值。(为什么我没有得到像array:[[ 1.,1.,],dtype = float32))是以Pycharm方式在新版本中打印张量的,还是我做错了什么?很高兴知道这件事的背后,如果我在任何地方错了,请帮助并原谅。

2 个答案:

答案 0 :(得分:1)

对于初学者来说,张量流的一个令人困惑的方面是有两种类型的形状:由tf.shape(x)给出的动态形状和由{给出的静态形状 {1}}(假设x.shape是张量)。它们代表相同的概念,但用法却大不相同。

静态形状是运行时已知的张量的形状。它本身就是一种数据类型,但是可以使用x将其转换为列表。

as_list()

在操作过程中,张量流尽可能地跟踪静态形状。在上面的示例中,根据x = tf.placeholder(shape=(None, 3, 4)) static_shape = x.shape shape_list = x.shape.as_list() print(shape_list) # [None, 3, 4] y = tf.reduce_sum(x, axis=1) print(y.shape.as_list()) # [None, 4] 的部分已知形状计算y的形状。请注意,我们甚至还没有创建会话,但是静态形状仍然是已知的。

由于不知道批次大小,因此无法在计算中使用静态第一项。

x

(我们可以除以z = tf.reduce_sum(x) / tf.cast(x.shape.as_list()[0], tf.float32) # ERROR ,因为该维在运行时是已知的-但这在这里无法显示任何内容)

如果我们需要使用静态未知的值(即,在图形构造时),则可以使用x.shape.as_list()[1]动态形状。动态形状是张量-就像张量流中的其他张量一样-使用会话进行评估。

x

您不能在动态形状上调用z = tf.reduce_sum(x) / tf.cast(tf.shape(x)[0], tf.float32) # all good! ,也不能在不进行会话评估的情况下检查其值。

答案 1 :(得分:0)

documentation中所述,您只能使用张量,操作或张量/操作列表来调用会话的run方法。您的最后一行代码调用run,结果为e.shape(),其类型为TensorShape。会话无法执行TensorShape参数,因此您会收到错误消息。

使用张量调用print时,系统将打印张量的内容。如果要打印张量的类型,请使用类似print(type(tensor))的代码。