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

tid*_*idy 7 python object-detection tensorflow tensorflow-model-analysis

我正在阅读faster-rcnntensorflow 模型的代码。我对使用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)
Run Code Online (Sandbox Code Playgroud)

更多代码在这里。我的问题是:如果tf.stop_gradient没有设置为会发生什么proposal_boxes

dan*_*ang 3

这确实是一个好问题,因为这条简单的线tf.stop_gradient对于训练 fast_rcnn 模型非常关键。这就是为什么在训练期间需要它。

Faster_rcnn 模型是两阶段检测器,损失函数必须满足两个阶段的目标。在faster_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 池化层是完全可微的,但支持方案二的主要原因是方案三会导致其在训练早期不稳定。

API 的一位作者在这里给出了一个非常好的答案

关于近似联合训练的一些进一步阅读