我是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方式在新版本中打印张量的,还是我做错了什么?很高兴知道这件事的背后,如果我在任何地方错了,请帮助并原谅。
答案 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))
的代码。