我浏览了更快的RCNN的code,以便更好地理解实现。
我使用gdb来调试python接口后面的C ++代码,我可以逐行查看C ++代码。
This paper(第4页,第一段)提到将卷积地图划分为2k得分和4k坐标。
使用this prototxt作为
实现 layer {
name: "rpn_conv/3x3"
type: "Convolution"
bottom: "conv5_3"
top: "rpn/output"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
convolution_param {
num_output: 512
kernel_size: 3 pad: 1 stride: 1
weight_filler { type: "gaussian" std: 0.01 }
bias_filler { type: "constant" value: 0 }
}
}
layer {
name: "rpn_cls_score"
type: "Convolution"
bottom: "rpn/output"
top: "rpn_cls_score"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
convolution_param {
num_output: 18 # 2(bg/fg) * 9(anchors)
kernel_size: 1 pad: 0 stride: 1
weight_filler { type: "gaussian" std: 0.01 }
bias_filler { type: "constant" value: 0 }
}
}
layer {
name: "rpn_bbox_pred"
type: "Convolution"
bottom: "rpn/output"
top: "rpn_bbox_pred"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
convolution_param {
num_output: 36 # 4 * 9(anchors)
kernel_size: 1 pad: 0 stride: 1
weight_filler { type: "gaussian" std: 0.01 }
bias_filler { type: "constant" value: 0 }
}
}
但我查看了代码,实际上是在cudnn_conv_layer.cpp and cudnn_conv_layer.cu
下实现的。
通过这些rpn_cls_score and rpn_bbox_pred
图层后,我可以看到输出blob形状
容量4 = {1,18,36,49}
容量4 = {1,36,36,49},所以它分成了分数和方框。
(1)我如何理解它经历的过程,以便256或512维分为{1,18,36,49}和{1,36,36,49}。有lr_mult
,但我甚至找不到如何使用lr_mult
?
(2)然后讨论了关于Loss实现的第一列,我找不到源代码中如何实现SGD损失最小化的来源?
答案 0 :(得分:0)
最好首先在CNN和Caffe上尝试一些基本教程。在不了解背景理论的情况下直接跳入Caffe实施可能会导致更多的混淆。
你所展示的原型文本区域只有3层卷积。
这两层都是卷积层。
请参阅CPU实施:https://github.com/BVLC/caffe/blob/master/src/caffe/layers/conv_layer.cpp
lr_mult是学习率倍增因子。在你的solver.prototxt中,会有一个base_lr。它与每层的lr_mult相乘,以获得该层的有效学习率。它是参数更新的一部分,对用户隐藏。 (这是机器学习框架之美)