我通过更快的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损失最小化的来源?
最好先尝试CNN和Caffe的一些基础教程。在不了解背景理论的情况下直接跳入Caffe实施可能会导致更多混乱。
无论你展示的prototxt的哪个区域只有3层卷积。
这两层都是卷积层。
请参阅CPU实现:https://github.com/BVLC/caffe/blob/master/src/caffe/layers/conv_layer.cpp
lr_mult是学习率倍增因子。在你的solver.prototxt中,会有一个base_lr。它与每层的lr_mult相乘,以获得该层的有效学习率。它是参数更新的一部分,对用户隐藏。 (那就是机器学习框架之美)