我正在阅读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)

更多代码是here。我的问题是:如果tf.stop_gradient未设置为proposal_boxes,会发生什么?

最佳答案

这是一个很好的问题,因为这条简单的线对于更快地训练rcnn模型非常重要。这就是为什么在训练中需要它。
快速rcnn模型是两级检测器,损失函数必须满足两级的目标。在快速rcnn中,rpn损耗和快速rcnn损耗都需要最小化。
这是报纸第3.2节所说的
独立训练的RPN和Fast R-CNN都将以不同的方式改变其洗浴层。因此,我们需要开发一种技术,允许在两个网络之间共享卷积层,而不是学习两个独立的网络。
然后介绍了三种训练方案,在原方案中采用了第一种方案——交替训练,即先训练RPN,然后训练快速RCNN。
第二种方案是近似联合训练,易于实现,该方案被API采用。快速R-CNN接受来自预测边界框(通过rpn)的输入坐标,因此快速R-CNN损失将具有梯度w.R.t边界框坐标。但是在这个训练方案中,这些梯度被忽略了,这正是使用tf.stop_gradient的原因。研究表明,该训练方案可使训练时间缩短25-50%。
第三种方案是非近似联合训练,因此不需要tf.stop_gradient。本文报道了在RoI池层上设置一个框坐标可微的w.r.t是一个非常重要的问题。
但是为什么这些梯度会被忽略呢?
结果表明,RoI池层是完全可微的,但支持方案2的主要原因是方案3会导致训练初期的不稳定。
API的一位作者给出了一个非常好的答案here
关于近似关节训练的一些文献[AA]。

08-26 03:08