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?
这确实是一个好问题,因为这条简单的线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 的一位作者在这里给出了一个非常好的答案
关于近似联合训练的一些进一步阅读。
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |