7

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

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

4

1 回答 1

3

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

Faster_rcnn 模型是两阶段检测器,损失函数必须满足两个阶段的目标。在fast_rcnn中,rpn loss和fast_rcnn loss都需要最小化。

这是论文在第 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 池化层是完全可微的,但支持方案 2 的主要原因是方案 3会导致它在训练早期不稳定。

API 的一位作者在这里有一个非常好的答案

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

于 2019-05-13T15:11:11.073 回答