0

我正在尝试编写一个模型,从 128 个提案中提取 10 个感兴趣的区域并将它们输入到 Dense 层:

# x is an input tensor of size [None, 128, 4].
# scores is the corresponding [None, 128] score vector.

indices = tf.image.non_max_suppression(x, scores, 10) 
x = x[indices]
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(20)(x)

当我将它包装在 keras 模型中并尝试编译它时,图形构建失败,因为tf.image.non_max_suppression返回一个形状的索引张量(None,)而不是(10,). 这使得扁平未知的(非批量)大小,x[indices]因此 Dense 层在编译时出现错误:

ValueError: The last dimension of the inputs to a Dense layer should be defined. Found None. Full input shape received: (None, None)

我的理解是 NMS 返回 n <= 10 个项目而不是 10 个项目,这就是它没有为图形指定固定输出形状的原因。选择 RoI 的输入数较高,这样从 NMS 中得到小于 10 RoI 的机会基本为零。我如何告诉我的模型它应该始终期望 NMS 准确返回 10 个项目,以便密集层的输入大小固定为 10*4?

4

1 回答 1

0

我设法通过将索引填充到固定长度来解决这个问题,如下所示:

fixed_size_indices = tf.zeros(10, tf.int32)
indices = tf.image.non_max_suppression(x, scores, 10) 
if tf.less_equal(tf.size(indices), 10):
   indices = tf.concat([indices, tf.zeros(10 - tf.size(indices), dtype="int32")], 0)
fixed_size_indices += indices
x = x[fixed_size_indices]

indices如果我只是在不将其添加到固定大小的张量的情况下进行填充,它将无法工作。

不确定这是否是最好或最优雅的解决方案,但它现在有效。理想情况下,如果 NMS 返回的区域少于 10 个,它将按照坏处的递增顺序填充额外的区域,但这超出了这个问题的范围。

于 2022-02-03T03:38:49.243 回答