检测TensorFlow中的最后一个维度是1还是5?

检测TensorFlow中的最后一个维度是1还是5?,tensorflow,Tensorflow,我正在编写TensorFlow(python)逻辑来确定张量的最后一个维度是1还是5。如果张量是标量,则此表达式应为false。在图构造时,张量的形状是未知的 给定张量输入,我已经试过了 tf.logical_and( # The tensor must not be a scalar. tf.greater(tf.rank(input), 0), # Check the last dimension. tf.logical_or( tf.equal(tf.shape(i

我正在编写TensorFlow(python)逻辑来确定张量的最后一个维度是1还是5。如果张量是标量,则此表达式应为false。在图构造时,张量的形状是未知的

给定张量
输入
,我已经试过了

tf.logical_and(
  # The tensor must not be a scalar.
  tf.greater(tf.rank(input), 0),
  # Check the last dimension.
  tf.logical_or(
    tf.equal(tf.shape(input)[-1], 1),
    tf.equal(tf.shape(input)[-1], 5)
  )
)
但是,当
输入
张量是标量时,此逻辑会引发错误,因为表达式的
tf.better(tf.rank(input),0)
部分无法导致TensorFlow短路(并避免执行图的
tf.logical\u或
部分)。这是预期的行为

有没有办法找到张量的最后一个维度,但让逻辑优雅地处理输入张量是标量的情况

例如,也许有一种方法可以强制执行一个控件依赖项,从而使秩检查首先运行


我想我可以在这里使用,但我有点担心调用lambda函数会如何改变图形。

您可以简单地扩展输入张量的dims,使其在所有情况下都能工作(即,将标量情况转换为张量):

输出:

Input: 1
Output: False

Input: [ 0.  0.]
Output: False

Input: [[ 0.  0.  0.  0.  0.]]
Output: True

Input: [[[ 0.  0.  0.  0.  0.  0.]
  [ 0.  0.  0.  0.  0.  0.]]]
Output: False

您可以简单地扩展输入张量的dims,使其在所有情况下都能工作(即,将标量情况转换为张量):

输出:

Input: 1
Output: False

Input: [ 0.  0.]
Output: False

Input: [[ 0.  0.  0.  0.  0.]]
Output: True

Input: [[[ 0.  0.  0.  0.  0.  0.]
  [ 0.  0.  0.  0.  0.  0.]]]
Output: False

在TF2中,您只需使用
.shape
并检查最后一个(
[-1]
)维度是否为您要查找的维度。您不必运行会话,因为在版本2中,默认情况下启用了即时执行

[1,5]中的一些张量形状[-1]
colab demo:

在TF2中,您只需使用
.shape
并检查最后一个(
[-1]
)维度是否是您要查找的维度。您不必运行会话,因为在版本2中,默认情况下启用了即时执行

[1,5]中的一些张量形状[-1] colab演示: