【问题标题】:Tensorflow what is the difference between None, -1 and ? when specifying tensor shape?Tensorflow 无、-1 和 之间有什么区别?指定张量形状时?
【发布时间】:2019-01-14 21:25:06
【问题描述】:

我经常看到符号“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)

使用这些符号中的任何一个在功能上是否存在差异?

谢谢

【问题讨论】:

  • 你试过了吗?
  • 据我所知,None 关键字是唯一被 tf.placeholder 接受的关键字,并且 reshape 只接受 -1 作为新的张量形状,这令人困惑,因为在 tensorflow 文档中这两个函数将形状对象作为他们的第二个参数。我不太确定 ?符号,stackoverflow.com/questions/40951602/… 也有类似的帖子,但他们没有提到 -1 中的任何一个都不是可接受的输入。
  • 好的,谢谢。我真的很抱歉,但我无法回答你。

标签: python tensorflow dynamic reshape tensor


【解决方案1】:

我是这样想的:

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] 是未定义的——我们应该做 [3, 2, 2] 吗? [2, 3, 2]? [6, 1, 2]?...

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

我可能在这里遗漏了更多技术细节,但根据经验:使用None 作为占位符,使用-1 进行整形。这应该涵盖大多数用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2019-04-11
    • 2017-11-22
    • 2018-08-03
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多