图层下降和更新咖啡模型

Layer drop and update caffe model

本文关键字:咖啡 模型 更新 图层      更新时间:2023-10-16

我需要从现有的caffe模型中更新caffe模型,我将删除最后两层。需要减少caffe模型的大小,这样部署起来更容易,尺寸更小。假设我现有的咖啡模型是A1。caffemodel,其中有5个卷积层3个全连通层。我想从它生成一个名为B1的新模型。caffemodel将有5个卷积层1个完全连接层(最后2个fc层被丢弃)。

我感谢你所有有价值的建议和有用的代码片段。

完全连接的层确实很笨重。请参阅Girshick, RFast-RCNN ICCV 2015中的"3.1截断SVD以更快地检测"一节,该节描述了如何使用SVD技巧显着减少全连接层的负担。因此,您可以将三个完全连接的层替换为6个非常薄的层。

从模型AB的步骤:

  1. 创建B.prototxt,具有与A相同的"name" s的5个卷积层

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

  3. 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. '/path/to/weights_B.caffemodel'开始微调模型B,以学习新的单全连接层的权值。

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");