Вы можете сделать это, используя тот факт, что минимальный и максимальный операторы поддерживают вещание.
Измените этот вывод coords
, чтобы иметь форму (B, N, 2, 2)
, где B
- размер пакета, а N
количество прямоугольников.Площадь перекрытия может быть вычислена как
c1 = coords[:, None]
c2 = coords[:, :, None]
areas = tf.reduce_prod(tf.maximum(
tf.minimum(c1[..., 1], c2[..., 1]) - tf.maximum(c1[..., 0], c2[..., 0]), 0.), axis=-1)
. Отсюда вы можете рассчитать стоимость, не забывая заботиться о диагональных элементах (соответствующих площади прямоугольников).Например, для простого суммирования областей,
cost = tf.reduce_sum(areas) - tf.reduce_sum(tf.trace(areas))
Правда, вы делаете некоторые дополнительные вычисления - диагональные элементы, а также перекрытия вычисляются дважды - но я считаю, что это должно быть незначительным по сравнению с остальнымивашей сети и, вероятно, быстрее, чем то, что основано на цикле.
Эта стоимость, конечно, автоматически дифференцируется по тензорному потоку.