C++实现Vgg19分类器(三)以二进制方式载入数据

本文详细介绍了如何将Vgg19模型参数以二进制形式保存和载入,通过这种方式,大幅提高了模型载入速度,从原来的长时间减少到仅需几秒钟,尤其是在第二次载入时效率更为显著。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面以二进制方式载入模型参数。

先把前面载入的数据以二进制保存:

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秒就可载入。

原因可能是数据不用转换,只要读取就好了,这样就只跟存储设备有关了。

我这个是笔记本固体硬盘,第二次运行可能在缓存上吧。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值