第二层卷积:
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张特征图:
从这里可以看到有的已经比原图更清了,拿一张出来和原图比一下:
第二层完成。