C++实现超分辨率重建 DBPN (一) 训练参数池

前面准备工作已经做得差不多了,现在开始。

先从简单的开始,选 DBPN 2倍开始,至于4,8 倍 以及 DBPNLL 的2, 4,8 倍以后再说。

先看图:

按图定义:

struct DBPN模型
{
	//初始特征提取(输入屋)
	ConvBlock feat0;
	ConvBlock feat1;

	//上下采样块
	UpBlock up1;
	DownBlock down1;
	UpBlock up2;
	D_DownBlock down2;
	D_UpBlock up3;
	D_DownBlock down3;
	D_UpBlock up4;
	D_DownBlock down4;
	D_UpBlock up5;
	D_DownBlock down5;
	D_UpBlock up6;
	D_DownBlock down6;
	D_UpBlock up7;

	//输出层
	ConvBlock output_conv;	

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

};

其中卷积和反卷积块:

struct ConvBlock //卷积
{
	层数据 * 层;
	float act; //prelu 系数
};

struct DeconvBlock //反卷积
{
	层数据 * 层;
	float act; //prelu 系数
};

上下采样块:

struct UpBlock
{
    DeconvBlock   up_conv1 ; 
    ConvBlock     up_conv2 ; 
    DeconvBlock   up_conv3 ;     
};

struct DownBlock
{
   ConvBlock      down_conv1 ; 
   DeconvBlock    down_conv2 ; 
   ConvBlock      down_conv3 ;
};

密集上下采样块:

struct D_UpBlock
{
	ConvBlock     conv ;
    DeconvBlock   up_conv1 ; 
    ConvBlock     up_conv2 ; 
    DeconvBlock   up_conv3 ;        
};

struct D_DownBlock
{
   ConvBlock      conv ; 
   ConvBlock      down_conv1 ;  
   DeconvBlock    down_conv2 ;  
   ConvBlock      down_conv3 ; 
};

分配空间:

DBPN模型::DBPN模型()
{
	int size;
	层数据 * 层;

	#define 初始化ONE层(ConvX,IN,OUT,KW) \
	\
	size = sizeof(层数据);\
	层= ConvX =(层数据 *)malloc(size);\
	层->输入维度=IN;\
	层->输出维度=OUT;\
	层->核宽=KW;\
	层->权重长度=层->输出维度*层->输入维度*层->核宽*层->核宽;\
	层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);\
	层->偏移长度=层->输出维度;\
	层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);\

        //if scale_factor == 2:
        int	kernel = 6;
        //	stride = 2
        //	padding = 2
        //elif scale_factor == 4:
        //	kernel = 8
        //	stride = 4
        //	padding = 2
        //elif scale_factor == 8:
        //	kernel = 12
        //	stride = 8
        //	padding = 2
	//初始特征提取(输入屋)
	初始化ONE层(feat0.层,3,256,3);
	初始化ONE层(feat1.层,256,64,1);

	//up1
	初始化ONE层(up1.up_conv1.层,64,64,kernel);
	初始化ONE层(up1.up_conv2.层,64,64,kernel);
	初始化ONE层(up1.up_conv3.层,64,64,kernel);

	//down1
	初始化ONE层(down1.down_conv1.层,64,64,kernel);
	初始化ONE层(down1.down_conv2.层,64,64,kernel);
	初始化ONE层(down1.down_conv3.层,64,64,kernel);

	//up2
	初始化ONE层(up2.up_conv1.层,64,64,kernel);
	初始化ONE层(up2.up_conv2.层,64,64,kernel);
	初始化ONE层(up2.up_conv3.层,64,64,kernel);


	#define UP_DOWN(DownX,UpX,InX) \
	/* down x */\
	初始化ONE层(DownX.conv.层,InX,64,1);\
	初始化ONE层(DownX.down_conv1.层,64,64,kernel);\
	初始化ONE层(DownX.down_conv2.层,64,64,kernel);\
	初始化ONE层(DownX.down_conv3.层,64,64,kernel);\
\
	/* up x+1 */\
	初始化ONE层(UpX.conv.层,InX,64,1);\
	初始化ONE层(UpX.up_conv1.层,64,64,kernel);\
	初始化ONE层(UpX.up_conv2.层,64,64,kernel);\
	初始化ONE层(UpX.up_conv3.层,64,64,kernel);\

	//从down2->down6 up3->up7
	int c=128;

	UP_DOWN(down2,up3,c);c+=64;

	UP_DOWN(down3,up4,c);c+=64;

	UP_DOWN(down4,up5,c);c+=64;

	UP_DOWN(down5,up6,c);c+=64;

	UP_DOWN(down6,up7,c);c+=64;

	//输出层
	初始化ONE层(output_conv.层,c,3,3);//7个64 =448  10个64 =640

}

然后载入前面从pytorch导出的训练参数,把它保存二进制方式,下次直接载入:

	DBPN模型 sr;
	// 加载 CNN 模型参数
	//loadModel(sr);

	//保存二进制方式模型
	//saveModel2进制(sr);

	//从二进制方式模型载入
	loadModel2进制( sr);

该部分结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值