前面已经得到FSRCNN的训练数据,现在拿来使用
先上一张图:
为了方便一点,层数据加入 输入 输出维度:
#define 总层数 8
struct 层数据
{
char 类型[255];
int 权重长度;
float * 权重_数据;
int 偏移长度;
float * 偏移_数据;
int 激活长度;
float * 激活_数据;
int 输入维度;
int 输出维度;
int 核宽;
};
模型结构:
struct fscrcnn_x3模型
{
int 层数; //8
层数据 * 所有层;
//构造函数
fscrcnn_x3模型();
};
fscrcnn_x3模型::fscrcnn_x3模型()
{
层数=总层数; //
int size;
size = sizeof(层数据)*层数;//
所有层=(层数据 *)malloc(size);
层数据 * 层=所有层;
for (int k = 0;k<总层数;k++)
{
switch(k)
{
case 0:
strcpy(层->类型, "卷积层");
层->权重长度=56*1*5*5;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=1;
层->输出维度=56;
层->核宽=5;
层->偏移长度=56;
层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
层->激活长度=56;
层->激活_数据=(float*)malloc(sizeof(float) * 层->激活长度);
break;
case 1:
strcpy(层->类型, "卷积层");
层->权重长度=12*56*1*1;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=56;
层->输出维度=12;
层->核宽=1;
层->偏移长度=12;
层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
层->激活长度=12;
层->激活_数据=(float*)malloc(sizeof(float) * 层->激活长度);
break;
case 2:
case 3:
case 4:
case 5:
strcpy(层->类型, "卷积层");
层->权重长度=12*12*3*3;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=12;
层->输出维度=12;
层->核宽=3;
层->偏移长度=12;
层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
层->激活长度=12;
层->激活_数据=(float*)malloc(sizeof(float) * 层->激活长度);
break;
case 6:
strcpy(层->类型, "卷积层");
层->权重长度=56*12*1*1;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=12;
层->输出维度=56;
层->核宽=1;
层->偏移长度=56;
层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
层->激活长度=56;
层->激活_数据=(float*)malloc(sizeof(float) * 层->激活长度);
break;
case 7:
strcpy(层->类型, "上采样层");
层->权重长度=56*1*9*9;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=56;
层->输出维度=1;
层->核宽=9;
层->偏移长度=1;
层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
层->激活长度=0;
层->激活_数据=NULL;
break;
}
层++;
}
}
到数据位置加载数据:
void 到数据位置_blobs(std::ifstream &fin)
{
char line0[256]; //每次从文件读一行
while(!fin.eof())
{
fin.getline(line0,255);
//cout<<line0<<endl;
//char *strstr(const char *haystack, const char *needle)
//在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。
if(strstr(line0, "blobs"))
break;
}
}
bool loadModel(fscrcnn_x3模型 *sr)
{
char name[]="fscrcnn_caffemodel.txt";
std::ifstream fin(name);
//检查文件是否存在
if (!fin)
{
return false;
}
cout<<"正在载入‘fscrcnn_x3.txt’的数据"<<endl;
//从档案载入
char str[40];
int len;
float * data;
层数据 * 层=sr->所有层;
for (int k = 0;k<总层数;k++)
{
//cout<<k<<"层"<<endl<<endl;
//先到数据位置 blobs
到数据位置_blobs(fin);
//1。读入权重
len=层->权重长度;//需要载入的个数
data=层->权重_数据;
//float tmp;
for(int i=0;i<len;i++)
{
fin >> str;
fin >> *data++;
}
//2。读入偏置
到数据位置_blobs(fin);
len=层->偏移长度;//需要载入的个数
data=层->偏移_数据;
for(int i=0;i<len;i++)
{
fin >> str;
fin >> *data++;
}
//3。读入激活值
len=层->激活长度;//需要载入的个数
if(len>0){
到数据位置_blobs(fin);
data=层->激活_数据;
for(int i=0;i<len;i++)
{
fin >> str;
fin >> *data++;
}
}else
printf("载入数据完成\n");
层++;//到下一层
}//end
fin.close ();
return true;
}
数据加载完成。