图层下拉和更新caffe模型

时间:2016-11-08 05:49:19

标签: python c++ caffe

我需要从现有的caffe模型更新caffe模型,我将删除最后两层。需要减少caffe模型的大小,以便部署更容易和更小。假设我现有的caffe模型是 A1.caffemodel ,它有 5个卷积层 3个完全连接的层 即可。我想从中生成名为 B1.caffemodel 的新模型,该模型将 5个卷积层 1完全连接图层 (丢弃最后2个fc图层。)

感谢您提出的所有有价值的建议和有用的代码段。

2 个答案:

答案 0 :(得分:3)

完全连接的层确实非常重。请查看" 3.1截断的SVD以便更快地检测"在Girshick, R Fast-RCNN ICCV 2015处描述如何使用SVD技巧显着减少完全连接的图层的负担。因此,您可以用6个非常薄的层替换三个完全连接的层。

从模型AB的步骤:

  1. 创建B.prototxt,其中包含5个卷积图层,其"name" A相同。

  2. B中的单个完全连接的图层提供"name"中不存在的新A

  3. 在python中

    import caffe
    B = caffe.Net('/path/to/B.prototxt', '/path/to/weights_A.caffemodel', caffe.TEST)
    B.save('/path/to/weights_B.caffemodel')
    
  4. 现在,B的权重与所有卷积层的A的权重相同,而新的单个完全连接的层的权重随机

  5. B开始微调模型'/path/to/weights_B.caffemodel',以了解新单个完全连接图层的权重。

答案 1 :(得分:1)

C ++实现:

    Net<float> caffe_net("B.prototxt", caffe::TEST);
    caffe_net.CopyTrainedLayersFrom("A.caffemodel");

    caffe::NetParameter net_param;
    caffe_net.ToProto(&net_param);
    caffe::WriteProtoToBinaryFile(net_param, "B.caffemodel");