前面准备工作已经做得差不多了,现在开始。
先从简单的开始,选 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);
该部分结束