这里也是用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) * 尾单位.归一化长度);
}
其它相同部分参看以前的文章
这部分结束。