我经常看到使用符号“ 无 ”,“ -1 ”和“ ? ”,以使程序动态定义张量的尺寸(例如批大小),似乎具有相同的效果:
x = tf.placeholder(tf.float32, [None, 48, 48, 3], name='InputData')
input = tf.reshape(input, [-1, input_size])
foo("bar", shape=(?,48), dtype=float32)
使用这些符号中的任何一个是否有功能上的区别?
谢谢
答案 0 :(得分:3)
我是这样想的:
None
表示未指定的尺寸。因此,例如,如果您定义了一个占位符,则使用None
来表示“此尺寸可以有任意大小”。
占位符可以具有多个None
维度。这仅表示多个尺寸可以不同。甚至整个形状也可以None
来指定未知数量的尺寸。
-1
是Tensorflow自行推断尺寸的指令。在tf.reshape(input, [-1, input_size])
中,这意味着“将其重塑为第二维为input_size
,而第一维就是匹配元素总数所需的任何值。”
not 不一定意味着维度未知,就像None
一样。如果输入张量的已知大小为10个元素,并且将其重塑为[-1, 2]
,则Tensorflow能够推断完整形状[5, 2]
。
-1
纯粹是为了方便。您总是可以显式地写下形状,而不是让Tensorflow推断它。另一方面,None
对于接受可变大小的张量是必需的。
形状中只能有一个-1
。多个没有意义,因为不可能推断出形状。例如。如果张量中有12个元素,则重塑为[-1, -1, 2]
是不确定的-我们应该做[3, 2, 2]
吗? [2, 3, 2]
? [6, 1, 2]
?...
最后,问号是Tensorflow在打印张量和/或其形状时用来标记“未知”尺寸的内容。您发布的示例实际上会产生语法错误-您不能自己使用问号。尺寸未知的原因当然可以是尺寸为None
的占位符,并且通常根据占位符定义的张量(即,对它们应用某些操作的结果)也将具有未知的尺寸。另外,某些操作可能未指定其输出形状(的一部分),这也会导致未知数。
我可能在这里错过了更多的技术知识,但是根据经验:使用None
作为占位符,使用-1
进行重塑。这应该涵盖了大多数用例。