Модели Faster_rcnn - это двухступенчатые детекторы, и функция потерь должна удовлетворять цели обоих этапов.В fast_rcnn потери rpn, а также потери fast_rcnn должны быть минимизированы.
И 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 был действительно хороший ответ здесь
Некоторые дальнейшее чтение относительно приблизительного совместного обучения.