如果未设置 tf.stop_gradient 会怎样?
What happens if tf.stop_gradient is not set?
我正在阅读 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。我的问题是:如果没有为 proposal_boxes
设置 tf.stop_gradient
会怎样?
这真是个好问题,因为这条简单的线tf.stop_gradient
在训练faster_rcnn模型时非常关键。这就是训练期间需要它的原因。
Faster_rcnn 模型是 two-staged 检测器,损失函数必须满足两个阶段的目标。在 faster_rcnn 中,rpn 损失和 fast_rcnn 损失都需要最小化。
这是论文第 3.2 节的内容
Both RPN and Fast R-CNN, trained independently will modify their convlolutional layers in different ways. We therefore need to develop a technique that allows for sharing convolutional layers between the two networks, rather than learning two separate networks.
论文接着描述了三种训练方案,在原论文中他们采用了第一种方案——Alternating training,即先训练RPN再训练Fast-RCNN .
第二种方案是近似联合训练,很容易实现,这个方案被API采用 . Fast R-CNN 接受来自预测边界框的输入坐标(通过 rpn),因此 Fast R-CNN 损失将具有梯度 w.r.t 边界框坐标。但在这个训练方案中,这些梯度被 忽略 ,这正是使用 tf.stop_gradient
的原因。论文报道称,该训练方案将减少训练时间25-50%。
第三种方案是Non-approximate联合训练,所以不需要tf.stop_gradient
。该论文报告说,具有可微分的 RoI 池化层 w.r.t 框坐标是一个非常重要的问题。
但是为什么这些梯度被忽略了呢?
事实证明,RoI 池化层是完全可微的,但支持方案二的主要原因是方案三会导致它在训练早期不稳定。
API 的一位作者给出了非常好的答案
关于近似联合训练的一些further reading。
我正在阅读 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。我的问题是:如果没有为 proposal_boxes
设置 tf.stop_gradient
会怎样?
这真是个好问题,因为这条简单的线tf.stop_gradient
在训练faster_rcnn模型时非常关键。这就是训练期间需要它的原因。
Faster_rcnn 模型是 two-staged 检测器,损失函数必须满足两个阶段的目标。在 faster_rcnn 中,rpn 损失和 fast_rcnn 损失都需要最小化。
这是论文第 3.2 节的内容
Both RPN and Fast R-CNN, trained independently will modify their convlolutional layers in different ways. We therefore need to develop a technique that allows for sharing convolutional layers between the two networks, rather than learning two separate networks.
论文接着描述了三种训练方案,在原论文中他们采用了第一种方案——Alternating training,即先训练RPN再训练Fast-RCNN .
第二种方案是近似联合训练,很容易实现,这个方案被API采用 . Fast R-CNN 接受来自预测边界框的输入坐标(通过 rpn),因此 Fast R-CNN 损失将具有梯度 w.r.t 边界框坐标。但在这个训练方案中,这些梯度被 忽略 ,这正是使用 tf.stop_gradient
的原因。论文报道称,该训练方案将减少训练时间25-50%。
第三种方案是Non-approximate联合训练,所以不需要tf.stop_gradient
。该论文报告说,具有可微分的 RoI 池化层 w.r.t 框坐标是一个非常重要的问题。
但是为什么这些梯度被忽略了呢?
事实证明,RoI 池化层是完全可微的,但支持方案二的主要原因是方案三会导致它在训练早期不稳定。
API 的一位作者给出了非常好的答案
关于近似联合训练的一些further reading。