Caffe - 将“.caffemodel”文件与Python-> C ++文件翻译图层一起使用

时间:2017-05-15 11:16:51

标签: caffe pycaffe

我有一个.prototxt文件和一个.caffemodel文件,用于我使用自我开发的Python图层 py-caffe 构建和培训的网络

后来,我为Caffe的C ++版本实现了相同的层。

问题是,是否有可能只在.prototxt文件中更改图层类型(从Python版本到C ++版本),同时按顺序使用相同的已经过培训的.caffemodel文件加载和使用训练好的网络,这次使用C ++图层?

1 个答案:

答案 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
  }
}