第二层卷积:
cout<<"第二层卷积..."<<endl;
// 第二层卷积:卷积核尺寸1×1(f2×f2),卷积核数目32(n2),输出32张特征图;
vector <卷积矩阵> conv2_data;//[32];//结果
for (int i = 0;i<32 ;i++)
{
卷积矩阵 conv2(wid,hei);
for (int j = 0 ;j<64;j++)
{
//conv2_data(:,:,i) = conv2_data(:,:,i) + weights_conv2(j,:,i) * conv1_data(:,:,j);
第二层运算(&conv2,&sr,&conv1_data[j],i,j);
}//end
//conv2_data(:,:,i) = max(conv2_data(:,:,i) + biases_conv2(i), 0);
加上偏移(&conv2,sr.偏移_conv2_数据,i);
conv2_data.push_back(conv2);
//保存32张特征图
im_tt=卷积矩阵2im(&conv2);
sprintf(txt, "conv2_data_0%d.jpg", i);
saveimage(txt, &im_tt);
cout<<i<<endl;
}//end
这个卷积核是1x1,所以不用卷积函数,用第二层运算代替:
//conv2_data(:,:,i) = conv2_data(:,:,i) + weights_conv2(j,:,i) * conv1_data(:,:,j);
bool 第二层运算(卷积矩阵 *conv2,SCREEN模型 *sr,卷积矩阵 *conv1_data, int num1,int num2)//32 64
{
// 第二层卷积:卷积核尺寸1×1(f2×f2),卷积核数目32(n2),输出32张特征图;
int w=conv2->width;
int h=conv2->height;
//float* r2=conv2->data;
//float* r1=conv1_data;
float weirht=sr->权重_conv2_数据[num1*sr->权重_conv2_长度+num2];
//cout<<"权重:"<<weirht<<"-"<<num1<<endl;
for(int i=0;i<w*h;i++)
{
conv2->data[i]+=conv1_data->data[i]*weirht;
//r1++;//r2++;
}
return true;
}
再加上偏移:
bool 加上偏移(卷积矩阵 *res,float* biases ,int num)
{
// conv1_data(:,:,i) = max(conv1_data(:,:,i) + biases_conv1(i), 0);
float*b=biases;
b+=num;
cout<<*b<<"-"<<num<<endl;
float temp;
for(int i=0;i<res->width*res->height;i++)
{
temp=(res->data[i]) + (*b);
res->data[i]=(temp>0)?temp:0;
}
return true;
}
32张特征图:
从这里可以看到有的已经比原图更清了,拿一张出来和原图比一下:
第二层完成。