#tensorflow #object-detection-api
#tensorflow #object-detection-api
Вопрос:
В нескольких статьях, например, в этой, утверждается, что потеря локализации IoU обеспечивает лучшую производительность, чем стандартная плавная потеря L1.
При попытке использовать потерю локализации IoU, т.е. используйте эту строку в файле конфигурации:
...
localization_loss {
weighted_iou {
}
}
...
Я всегда получаю found NaN in loss
ошибку. Если я добавлю небольшую согласующую (например, 1e-7
) к знаменателю в matched_iou
вот так:
def matched_iou(boxlist1, boxlist2, scope=None):
"""Compute intersection-over-union between corresponding boxes in boxlists.
Args:
boxlist1: BoxList holding N boxes
boxlist2: BoxList holding N boxes
scope: name scope.
Returns:
a tensor with shape [N] representing pairwise iou scores.
"""
with tf.name_scope(scope, 'MatchedIOU'):
intersections = matched_intersection(boxlist1, boxlist2)
areas1 = area(boxlist1)
areas2 = area(boxlist2)
unions = areas1 areas2 - intersections
eps = 1e-7 # <- this is the small constant
return tf.where(
tf.equal(intersections, 0.0),
tf.zeros_like(intersections), tf.truediv(intersections, unions eps))
NaN
Ошибка устранена, но значения потерь действительно высоки, и обучение не сходится.
Я буду признателен за любой намек на это явление.
Комментарии:
1. Как вам удалось запустить функцию потери IOU в первую очередь? Когда я меняю его на использование потери IOU, возникает ошибка о формах
2. Неважно, вам просто нужно изменить размер пакета..
3. Привет @BrunoLerner, пожалуйста, поделитесь своими обновлениями по этой проблеме, у меня все еще нет решения для этого
4. Вчера я провел эксперимент, и он также не сошелся.. Итак, я думал ночью, вы изменили его на [batch_size, -1] или [batch_size, num_anchors, -1] ? У меня есть 2 гипотезы.. Во-первых, я неправильно изменил его, а во-вторых, прогноз выполняется не так, как ожидает конструктор boxlist (то есть [y_max, x_max, y_min, x_min])
5. Какую модель вы используете? Я использую SSD, и я сильно подозреваю, что проблема заключается в том, что тензор прогнозирования принимает форму, которая сильно отличается от того, что ожидает matched_iou. Потому что, если вы читали некоторые статьи, обозначения ограничивающей рамки относятся к привязочным блокам
Ответ №1:
После небольшого изучения кода кажется, что prediction_tensor
и target_tensor
приходят к функции потери IOU как к закодированному тензору (относительно блоков привязки). Таким образом, функция IoU работает с бессмысленными значениями, потому что она ожидает их в декодированном формате.. Существует функция для ее декодирования с помощью BoxCoder
которая зависит от используемого вами кодера, но проблема в том, что для ее использования вам нужен anchor boxes
.. и получить поля привязки внутри функции потери не так просто.