现在来实现
<密集残差块总成> 这个函数:
对照下图灰框部分
void 密集残差块总成(RDN模型 & sr,卷积层 & s_di)//从s_di 传入并返回
{
int wid=s_di.width;
int hei=s_di.height;
int wh= wid*hei;
int whd=wh*s_di.depth;
//连接池
卷积层 总连接池(wid,hei,320); //用于5个密集残差块输出总成
总连接池.data=new float[wh * 320 ];
卷积层 连接池(wid,hei,256); //用于单个密集残差块内部
连接池.data=new float[wh * 256 ];
密集残差块 * 密集残差块0=sr.块;
cout<<sr.密集残差块数量<<"个密集残差块... "<<endl;
卷积层 cat目标(wid , hei , 64);//也用于复制
cat目标.data=总连接池.data;//指向头,后面向后移
卷积层 复制用(wid , hei , 64);//也用于复制
//复制用.data=总连接池.data;
for (int k = 0;k<sr.密集残差块数量;k++)
{
cout<<"\r"<<k;
if(k==0)
{
卷积层复制(&s_di,&cat目标);//准备输入数据(第一个)
}
else
{
复制用.data=cat目标.data-whd;//上一个结果即当前输入
卷积层复制(&复制用,&cat目标);//准备输入数据
}
密集残差块前传(*密集残差块0,cat目标,连接池);
cat目标.data+=whd;//到下一位置
密集残差块0++;//到下密集残差块
}
cout<<endl;
卷积层 目标(wid,hei,s_di.depth);
目标.data=连接池.data; //暂用
int pad=sr.conv3->核宽/2;
vl_nnconv(&总连接池,&目标,sr.conv3 ,1,1,pad,pad,pad,pad);
pad=sr.conv4->核宽/2;
vl_nnconv(&目标,&s_di,sr.conv4 ,1,1,pad,pad,pad,pad);
del卷积层(连接池);
del卷积层(总连接池);
}
<密集残差块前传> 函数参看ESRGAN一文。
RND这部分就结束了。