我需要从现有的caffe模型更新caffe模型,我将删除最后两层。需要减少caffe模型的大小,以便部署更容易和更小。假设我现有的caffe模型是 A1.caffemodel ,它有 5个卷积层 和 3个完全连接的层 即可。我想从中生成名为 B1.caffemodel 的新模型,该模型将 5个卷积层 和 1完全连接图层 (丢弃最后2个fc图层。)
感谢您提出的所有有价值的建议和有用的代码段。
答案 0 :(得分:3)
完全连接的层确实非常重。请查看" 3.1截断的SVD以便更快地检测"在Girshick, R Fast-RCNN ICCV 2015处描述如何使用SVD技巧显着减少完全连接的图层的负担。因此,您可以用6个非常薄的层替换三个完全连接的层。
从模型A
到B
的步骤:
创建B.prototxt
,其中包含5个卷积图层,其"name"
与A
相同。
为B
中的单个完全连接的图层提供"name"
中不存在的新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
的权重相同,而新的单个完全连接的层的权重随机。
从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");