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