还是和前面一样,我们只关注模型训练好后的应用,即生成网络
先看图:
它由1个输入卷积和2个下采样层(步长为2的卷积)和ReLU非线性,
5个残差块,
2个上采样层(步长为1/2的卷积,就是哪个反向卷积(转置))
最后是一个产生输出图像的非线性tanh层组成。
残差块图:
残差块由2个卷积和一个ReLU组成
网络内部效果图:
定义数据池:
struct Transformation_tf模型
{
层数据 * 输入层;
层数据 * 下采样层1;
层数据 * 下采样层2;
int 残差块数量;//5块
残差块 * 块;
层数据 * 上采样层1;
层数据 * 上采样层2;
层数据 * 输出层;
//构造函数
Transformation_tf模型();
};
初始化:
Transformation_tf模型::Transformation_tf模型()
{
int size;
size = sizeof(层数据);//
输入层 =(层数据 *)malloc(size);
层数据 * 层=输入层;
层->权重长度=32*3*9*9;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=3;
层->输出维度=32;
层->核宽=9;
层->偏移长度=0;
层->偏移_数据=NULL;
//下采样层1;
size = sizeof(层数据);//
下采样层1 =(层数据 *)malloc(size);
层=下采样层1;
层->权重长度=64*32*3*3;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=32;
层->输出维度=64;
层->核宽=3;
层->偏移长度=0;
层->偏移_数据=NULL;
// 下采样层2;
size = sizeof(层数据);//
下采样层2 =(层数据 *)malloc(size);
层=下采样层2;
层->权重长度=128*64*3*3;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=64;
层->输出维度=128;
层->核宽=3;
层->偏移长度=0;
层->偏移_数据=NULL;
//块
残差块数量=5;
size = sizeof(残差块)*残差块数量;
块=(残差块*)malloc(size);
残差块 * 残差块0=块;
for (int k = 0;k<残差块数量;k++)
{
残差块0->num=2;
size = sizeof(层数据)*2;
残差块0->卷积层=(层数据*)malloc(size);
层=残差块0->卷积层;
for(int p=0;p<2;p++){
层->权重长度=128*128*3*3;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=128;
层->输出维度=128;
层->核宽=3;
层->偏移长度=0;//
层->偏移_数据=NULL;//
层++;
}
残差块0++;
}
//上采样层1;
size = sizeof(层数据);//
上采样层1=(层数据 *)malloc(size);
层=上采样层1;
层->权重长度=64*128*3*3;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=128;
层->输出维度=64;
层->核宽=3;
层->偏移长度=0;
层->偏移_数据=NULL;
//上采样层2;
size = sizeof(层数据);//
上采样层2=(层数据 *)malloc(size);
层=上采样层2;
层->权重长度=32*64*3*3;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=64;
层->输出维度=32;
层->核宽=3;
层->偏移长度=0;
层->偏移_数据=NULL;
//输出层;
size = sizeof(层数据);//
输出层=(层数据 *)malloc(size);
层=输出层;
层->权重长度=3*32*9*9;
层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
层->输入维度=32;
层->输出维度=3;
层->核宽=9;
层->偏移长度=0;
层->偏移_数据=NULL;
}
然后就可以载入数据了,
由于数据中有nan值,这里先把它们替换为0。这样可能会和tf结果相差一点吧
这部分结束