我有一个.prototxt
文件和一个.caffemodel
文件,用于我使用自我开发的Python图层 py-caffe 构建和培训的网络
后来,我为Caffe的C ++版本实现了相同的层。
问题是,是否有可能只在.prototxt
文件中更改图层类型(从Python版本到C ++版本),同时按顺序使用相同的已经过培训的.caffemodel
文件加载和使用训练好的网络,这次使用C ++图层?
答案 0 :(得分:1)
是的,当然有可能。如果您有图层参数,则应该向caffe.proto添加一个新的layer_param消息,并在cpp图层中相应地读取它们。
例如,PVANet caffe repository具有原始Python提议层的实现
正如您在caffe.proto中看到的那样,添加了一条新消息来保存Python图层的参数 -
//存储ProposalLayer使用的参数的消息
message ProposalParameter {
optional uint32 feat_stride = 1 [default = 16];
optional uint32 base_size = 2 [default = 16];
optional uint32 min_size = 3 [default = 16];
repeated float ratio = 4;
repeated float scale = 5;
optional uint32 pre_nms_topn = 6 [default = 6000];
optional uint32 post_nms_topn = 7 [default = 300];
optional float nms_thresh = 8 [default = 0.7];
}
原始列车/测试原型包含以下图层:
layer {
name: 'proposal'
type: 'Python'
bottom: 'rpn_cls_prob_reshape'
bottom: 'rpn_bbox_pred'
bottom: 'im_info'
top: 'rpn_rois'
top: 'rpn_scores'
include { phase: TRAIN }
python_param {
module: 'rpn.proposal_layer'
layer: 'ProposalLayer'
param_str: "{'feat_stride': 16, 'ratios': [0.333, 0.5, 0.667, 1, 1.5, 2, 3], 'scales': [2, 3, 5, 9, 16, 32]}"
}
}
当新的cpp看起来像:
layer {
name: 'proposal'
type: 'proposal'
bottom: 'rpn_cls_prob_reshape'
bottom: 'rpn_bbox_pred'
bottom: 'im_info'
top: 'rpn_rois'
top: 'rpn_scores'
include { phase: TRAIN }
proposal_param {
feat_stride: 16
ratios: 0.333, 0.5, 0.667, 1, 1.5, 2, 3
scales: 2, 3, 5, 9, 16, 32
}
}
等