纯C++超分辨率重建DRRN --改编--(一)数据结构

这里也是用caffemodel中导出的数据来使用,先来看一下 DRRN 中的结构构成:

(1)基本单位,(2)残差块。

基本单位由:
1。归一化(BatchNorm),2。缩放和平移(Scale),3。Relu激励,4。卷积(Conv) 来组成

一个残差块由:
2个基本单位 组成(第一和第二)


全部由:
首单位 、9个残差块、尾单位 共 20 个单位组成(1 + 9 x 2 + 1)。
其中所有残差块的卷积核(第一和第二)共用,BatchNorm、Scale 则独立

定义基本单位:

struct 基本单位也就是 残差块的半层数据
{
		层数据 *卷积层; 
		int 归一化长度;
		float *	u; //均值 和方差
		float *	std;
		float *	alpha; //缩放 和位移
		float *	beta;
};

定义残差块:

struct 残差块
{
	int num;//数量 2
	基本单位 *数据;
};

定义DRRN模型:

struct DRRN模型  //不分倍数,通用
{
	

	基本单位 首单位; //半层

	int 残差块数量;//9块
	残差块 * 块;
	
	基本单位 尾单位; //总10层

	//构造函数
	DRRN模型();

};

初始化模型,其中所有残差块卷积核重用一套数据:

DRRN模型::DRRN模型()
{

	int size;
	int len;
			size = sizeof(层数据);//
			首单位.卷积层=(层数据 *)malloc(size);
		层数据 *层=首单位.卷积层;
				strcpy(层->类型, "卷积层");
				层->权重长度=128*1*3*3;
				层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
				层->输入维度=1;
				层->输出维度=128;
				层->核宽=3;
				层->偏移长度=128;
				层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);

			首单位.归一化长度=len=1;
			首单位.u=(float*)malloc(sizeof(float) * len);
			首单位.std=(float*)malloc(sizeof(float) * len);
			首单位.alpha=(float*)malloc(sizeof(float) * len);
			首单位.beta=(float*)malloc(sizeof(float) * len);

	//块 
	残差块数量=9;
	size = sizeof(残差块)*残差块数量;
	块=(残差块*)malloc(size);
	残差块 * 残差块0=块;
	//----------所有残差块卷积核重用一套数据
	float *	第一权重_数据;
	float *	第一偏移_数据;
	float *	第二权重_数据;
	float *	第二偏移_数据;
	//-------------
	for (int k = 0;k<残差块数量;k++)
	{
		//先设置"残差块"

		残差块0->num=2;
			
		size = sizeof(基本单位)*2;

		残差块0->数据=(基本单位*)malloc(size);

		for(int p=0;p<2;p++){
			size = sizeof(层数据);//
			残差块0->数据[p].卷积层=(层数据 *)malloc(size);
			层=残差块0->数据[p].卷积层;
				strcpy(层->类型, "卷积层");
				层->权重长度=128*128*3*3;
				if(k==0){
					层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
					if(p==0)
						第一权重_数据=层->权重_数据;
					else
						第二权重_数据=层->权重_数据;
				}else
				{
					if(p==0)
						层->权重_数据=第一权重_数据;
					else
						层->权重_数据=第二权重_数据;
				}
				层->输入维度=128;
				层->输出维度=128;
				层->核宽=3;
				层->偏移长度=128;
				if(k==0){
					层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
					if(p==0)
						第一偏移_数据=层->偏移_数据;
					else
						第二偏移_数据=层->偏移_数据;
				}else
				{
					if(p==0)
						层->偏移_数据=第一偏移_数据;
					else
						层->偏移_数据=第二偏移_数据;
				}
				

			残差块0->数据[p].归一化长度=len=128;
			残差块0->数据[p].u=(float*)malloc(sizeof(float) * len);
			残差块0->数据[p].std=(float*)malloc(sizeof(float) * len);
			残差块0->数据[p].alpha=(float*)malloc(sizeof(float) * len);
			残差块0->数据[p].beta=(float*)malloc(sizeof(float) * len);
		}

		残差块0++;
	}


			size = sizeof(层数据);//
			尾单位.卷积层=(层数据 *)malloc(size);
			层=尾单位.卷积层;
				strcpy(层->类型, "卷积层");
				层->权重长度=1*128*3*3;
				层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
				层->输入维度=128;
				层->输出维度=1;
				层->核宽=3;
				层->偏移长度=1;
				层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);

			尾单位.归一化长度=128;
			尾单位.u=(float*)malloc(sizeof(float) * 尾单位.归一化长度);
			尾单位.std=(float*)malloc(sizeof(float) * 尾单位.归一化长度);
			尾单位.alpha=(float*)malloc(sizeof(float) * 尾单位.归一化长度);
			尾单位.beta=(float*)malloc(sizeof(float) * 尾单位.归一化长度);



}

其它相同部分参看以前的文章

这部分结束。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值