如果未设置tf.stop_gradient,会发生什么



我正在阅读TensorFlow模型的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_gradientproposal_boxes

,会发生什么情况。

这确实是一个很好的问题,因为这条简单的行tf.stop_gradient对于训练更快的_rcnn模型至关重要。这就是为什么在培训期间需要它的原因。

更快的_rcnn模型是两级检测器,损耗函数必须实现这两个阶段的目标。在faster_rcnn中,RPN损失以及FAST_RCNN损失都需要最小化。

这是论文在第3.2节中所说的

RPN和Fast R-CNN都受过独立训练的训练,将以不同的方式修改其弯曲层。因此,我们需要开发一种允许在两个网络之间共享卷积层的技术,而不是学习两个独立的网络。

然后,本文描述了三个培训方案,在原始论文中,他们采用了第一个解决方案 - 交替培训,即首先是训练RPN,然后训练Fast-Rcnn。

第二个方案是近似联合培训,它易于实现,此方案由API 采用。快速R-CNN接受预测边界框(由RPN(的输入坐标,因此快速的R-CNN损耗将具有梯度W.R.T边界框坐标。但是在此训练方案中,这些梯度被忽略,这正是使用tf.stop_gradient的原因。该论文报告说,该培训计划将使培训时间减少25-50%。

第三个方案是非同一关节培训,因此不需要tf.stop_gradient。该论文报告说,具有可区分W.R.T的ROI合并层是一个非平凡的问题。

但是为什么这些梯度被忽略了?

事实证明,投资回报率池层是完全可区分的,但是偏爱方案二的主要原因是方案三会在训练期间早期不稳定。

API的作者之一在这里有一个很好的答案

有关近似联合培训的进一步阅读。

最新更新