Python 图层删除和更新caffe模型

Python 图层删除和更新caffe模型,python,c++,caffe,Python,C++,Caffe,我需要从现有的caffe模型中更新caffe模型,在该模型中我将删除最后两层。需要减小caffe模型的尺寸,以使其更易于部署,且尺寸更小。假设我现有的caffe模型是A1.caffemodel,它有5个卷积层和3个完全连接层。我想从中生成一个名为B1.caffemodel的新模型,该模型将有5个卷积层和1个完全连接层(最后2个fc层被丢弃) 我感谢您所有有价值的建议和有用的代码片段 完全连接的层确实可能非常重。请参阅“3.1截断SVD以提高检测速度”一节,介绍如何使用技巧显著降低完全连接层的负担

我需要从现有的caffe模型中更新caffe模型,在该模型中我将删除最后两层。需要减小caffe模型的尺寸,以使其更易于部署,且尺寸更小。假设我现有的caffe模型是A1.caffemodel,它有5个卷积层和3个完全连接层。我想从中生成一个名为B1.caffemodel的新模型,该模型将有5个卷积层和1个完全连接层(最后2个fc层被丢弃)


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

完全连接的层确实可能非常重。请参阅“3.1截断SVD以提高检测速度”一节,介绍如何使用技巧显著降低完全连接层的负担。因此,您可以将三个完全连接的层替换为6个非常薄的层

从型号
A
B
的步骤:

  • 创建具有5个卷积层的
    B.prototxt
    ,与
    A
    具有相同的
    “名称”
    s

  • B
    中的单个完全连接层提供一个新的
    名称
    ,该名称在
    a
    中不存在

  • 用python

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

  • '/path/to/weights\u 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");
    
    Net-caffe\u-Net(“B.prototxt”,caffe::TEST);
    caffe_net.copyratedLayers from(“A.CAFFEFOModel”);
    caffe::NetParameter net_param;
    caffe_net.ToProto(&net_param);
    caffe::WriteProtoToBinaryFile(net_参数,“B.caffemodel”);
    
    想到这一点,您可以跳过步骤3和步骤4,使用
    -weights/path/to/weights\u A从命令行微调
    B
    。caffemodel
    :caffe将自动从weights\u A获取所有卷积层(它们具有相同的“名称”)的参数,并随机初始化新的完全连接层(因为它在<代码> WebStIA<代码>中找不到它的名字。C++的步骤3中的实现。