Caffe模型训练好以后,有时候我们只需要提取特征,而不需要最后的分类全连接层,只需要前面一层的特征层的参数。人脸识别模型就是典型的例子,训练的时候最后一个全连接为人的身份类别全连接,实际应用部署只需要前一层提特征,然后人脸特征比对,因此最后一层并不需要,而最后一层全连接又占据了大量的参数,模型.caffemodel非常大,因此需要去掉最后一层参数再部署。
Code:
#include
/*这些包含文件在caffe.hpp中都有包含 此处写出来只是为了清楚读写模型参数需要的函数在哪里,依赖什么?*/
//#include
//#include
//#include
//#include
//#include
//#include
//#include
//#include
//#include
//#include
//#include "caffe/common.hpp"
//#include "caffe/proto/caffe.pb.h"
//#include "caffe/util/io.hpp"
//using google::protobuf::io::FileInputStream;
//using google::protobuf::io::FileOutputStream;
//using google::protobuf::io::ZeroCopyInputStream;
//using google::protobuf::io::CodedInputStream;
//using google::protobuf::io::ZeroCopyOutputStream;
//using google::protobuf::io::CodedOutputStream;
//using google::protobuf::Message;
using namespace caffe;
using namespace std;
int main()
{
std::string model_dir = "your .caffemodel path";
std::string save_dir ="your .txt path";
std::string finalsave_dir = "your new caffemodel path";
//声明网络参数对象,即NetParameter对象
NetParameter proto;
//1、读取caffemodel参数到NetParameter对象
ReadProtoFromBinaryFile(model_dir, &proto);
//2、以proto格式写入txt
WriteProtoToTextFile(proto, save_dir);
/*3、写完之后,可以打开txt手动剔除最后一层参数,然后存储到.caffemodel */
//NetParameter proto2;
//4、从txt读取修改过的参数到Netparameter
//ReadProtoFromTextFileOrDie(save_dir, &proto2);
//5、重新将新修改过的proto写入.caffemodel
//WriteProtoToBinaryFile(proto2, finalsave_dir);
return 0;
}