Tensorflow None,-1和之间有什么区别?指定张量形状时?

Dav*_* Yu 3 python dynamic reshape tensorflow tensor

我经常看到使用符号“ None ”,“ -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)
Run Code Online (Sandbox Code Playgroud)

使用这些符号中的任何一个是否与其他符号有功能上的区别?

谢谢

xdu*_*ch0 5

我是这样想的:

None表示未指定的尺寸。因此,例如,如果您定义一个占位符,那么您None通常会说“此尺寸可以具有任何大小”。
占位符可以具有多个None维度。这仅表示多个尺寸可以不同。甚至整个形状都可以None指定未知数量的尺寸。

-1是Tensorflow自行推断尺寸大小的指令。在中tf.reshape(input, [-1, input_size]),这表示“将其重塑为第二维为input_size,而第一维为匹配元素总数所需的任何值”。
但这并不一定意味着尺寸是未知的,因为它是None。如果输入张量的已知大小为10个元素,并且将其调整为[-1, 2],则Tensorflow可以推断完整形状[5, 2]
-1纯粹是为了方便。您总是可以显式地写下形状,而不是让Tensorflow推断它。None另一方面,接受可变大小的张量是必需的。
你只能拥有一个-1形状。多个没有意义,因为不可能推断出形状。例如,如果张量中有12个元素,则重塑[-1, -1, 2]为undefined -我们应该这样做[3, 2, 2]吗?[2, 3, 2][6, 1, 2]?...

最后,问号就是Tensorflow在打印张量和/或其形状时用来标记“未知”尺寸的内容。您发布的示例实际上会产生语法错误-您不能自己使用问号。尺寸未知的原因当然可以是带有None尺寸的占位符,并且通常根据占位符定义的张量(即,对它们应用某些操作的结果)也将具有未知的尺寸。另外,某些操作可能未指定其输出形状(的一部分),这也可能导致未知数。

我可能在这里错过了更多技术性知识,但是根据经验:None用于占位符和-1用于重塑。这应该涵盖大多数用例。