Что произойдет, если tf.stop_gradient не установлен? - PullRequest
3 голосов
/ 09 мая 2019

Я читаю код faster-rcnn моделей тензорного потока. Я запутался с использованием tf.stop_gradient.

Рассмотрим следующий фрагмент кода:

if self._is_training:
    proposal_boxes = tf.stop_gradient(proposal_boxes)
    if not self._hard_example_miner:
    (groundtruth_boxlists, groundtruth_classes_with_background_list, _,
     groundtruth_weights_list
    ) = self._format_groundtruth_data(true_image_shapes)
    (proposal_boxes, proposal_scores,
     num_proposals) = self._sample_box_classifier_batch(
         proposal_boxes, proposal_scores, num_proposals,
         groundtruth_boxlists, groundtruth_classes_with_background_list,
         groundtruth_weights_list)

Дополнительный код здесь . Мой вопрос: что произойдет, если tf.stop_gradient не установлен для proposal_boxes?

1 Ответ

1 голос
/ 13 мая 2019

Это действительно хороший вопрос, потому что эта простая строка tf.stop_gradient очень важна при обучении моделей fast_rcnn.Вот почему это необходимо во время обучения.

Модели Faster_rcnn - это двухступенчатые детекторы, и функция потерь должна удовлетворять цели обоих этапов.В fast_rcnn потери rpn, а также потери fast_rcnn должны быть минимизированы.

Вот что говорится в статье в разделе 3.2

И RPN, и Fast R-CNN, обученные независимо, изменят свои сверточные слои различными способами.Поэтому нам необходимо разработать методику, позволяющую разделять сверточные слои между двумя сетями, а не изучать две отдельные сети.решение - Переменное обучение , то есть сначала поезд RPN, а затем поезд Fast-RCNN.

Вторая схема Примерное совместное обучение , его легко реализовать и эта схема принята API .Fast R-CNN принимает входные координаты из прогнозируемых ограничивающих прямоугольников (через rpn), поэтому потеря Fast R-CNN будет иметь градиенты относительно координат ограничивающих прямоугольников.Но в этой схеме обучения эти градиенты игнорируются , именно поэтому используется tf.stop_gradient.В документе сообщается, что эта схема обучения сократит время обучения на 25-50%.

Третья схема Неподходящее совместное обучение , поэтому tf.stop_gradient не требуется.В статье сообщается, что наличие слоя пула RoI, который является дифференцируемым по координатам блока, является нетривиальной проблемой.

Но почему эти градиенты игнорируются?

Оказывается, что уровень пула RoI полностью дифференцируем, но основной причиной, по которой предпочтение отдается схеме два, является схема три , которая приведет к нестабильной работе на ранних этапах обучения.

Oneиз авторов API был действительно хороший ответ здесь

Некоторые дальнейшее чтение относительно приблизительного совместного обучения.

...