下面以二进制方式载入模型参数。
先把前面载入的数据以二进制保存:
void fwrite_c(FILE *fp,int &len, float * data);
void saveModel2进制(Vgg19模型 *sr)
{
char name[]= "VGG_ILSVRC_19_layers.caffemodel.dat";//
cout<<"正在保存‘Vgg19模型’的数据到二进制文件"<<endl;
FILE *fp;
//if((fp=fopen(name,"r"))==NULL)
if(fopen_s(&fp,name,"wb")!=0)
cout<<"打开文件出错了:"<<name<<endl;
int len;
float * data;
层数据 * 层;
//保存卷积
//定义一个宏
#define 保存卷积(ConvX,Num) \
层=sr->ConvX;\
for (int i=0;i<Num ;i++ )\
{\
/*1。保存权重*/\
len=层->权重长度;/*需要载入的个数*/ \
data=层->权重_数据;\
\
fwrite_c(fp,len,data);\
\
/*2。保存偏移*/\
len=层->偏移长度;\
data=层->偏移_数据;\
\
fwrite_c(fp,len,data);\
层++;\
}\
cout<<"Conv1..."<<endl;
保存卷积(Conv1,2)
cout<<"Conv2..."<<endl;
保存卷积(Conv2,2)
cout<<"Conv3..."<<endl;
保存卷积(Conv3,4)
cout<<"Conv4..."<<endl;
保存卷积(Conv4,4)
cout<<"Conv5..."<<endl;
保存卷积(Conv5,4)
cout<<"fc6..."<<endl;
保存卷积(fc6,1)
cout<<"fc7..."<<endl;
保存卷积(fc7,1)
cout<<"fc8..."<<endl;
保存卷积(fc8,1)
cout<<"保存完成"<<endl;
fclose(fp);
}
3.4G文件已经变成548M了,二进制载入:
void fread_c(FILE *fp,int &len, float * data);//从二进制文件读出
bool loadModel2进制(Vgg19模型 *sr)
{
char name[]= "VGG_ILSVRC_19_layers.caffemodel.dat";//
cout<<"正在从二进制文件载入‘Vgg19模型’的数据"<<endl;
FILE *fp;
//if((fp=fopen(name,"r"))==NULL)
//if(fopen_s(&fp,name,"rb")!=0)
if((fp=openfile(name,"rb"))==NULL)
{
cout<<"打开文件出错了:"<<name<<endl;
return false;
}
int len;
float * data;
层数据 * 层;
//读取卷积
//定义一个宏
#define 读取卷积(ConvX,Num) \
层=sr->ConvX;\
for (int i=0;i<Num ;i++ )\
{\
/*1。保存权重*/\
len=层->权重长度;/*需要载入的个数*/ \
data=层->权重_数据;\
\
fread_c(fp,len,data);\
\
/*2。保存偏移*/\
len=层->偏移长度;\
data=层->偏移_数据;\
\
fread_c(fp,len,data);\
层++;\
}\
cout<<"Conv1..."<<endl;
读取卷积(Conv1,2)
cout<<"Conv2..."<<endl;
读取卷积(Conv2,2)
cout<<"Conv3..."<<endl;
读取卷积(Conv3,4)
cout<<"Conv4..."<<endl;
读取卷积(Conv4,4)
cout<<"Conv5..."<<endl;
读取卷积(Conv5,4)
cout<<"fc6..."<<endl;
读取卷积(fc6,1)
cout<<"fc7..."<<endl;
读取卷积(fc7,1)
cout<<"fc8..."<<endl;
读取卷积(fc8,1)
cout<<"载入完成"<<endl;
fclose(fp);
return true;
}
现在载入速度飞快,只要4秒,如果在SD卡运行要24秒。
如果第二次运行则只要0.5秒就可载入。
原因可能是数据不用转换,只要读取就好了,这样就只跟存储设备有关了。
我这个是笔记本固体硬盘,第二次运行可能在缓存上吧。