c++实现Pooling过程

来源:互联网 发布:linux 执行python脚本 编辑:程序博客网 时间:2024/05/21 01:32

直接上代码:

#include<iostream>#include<vector>using namespace std;int main(){    //定义被卷积的矩阵(其实是一个数组,数组元素的个数8*8)    int const map = 8;    float  A[map*map] =    {        8, 7, 6, 5, 4, 3, 2, 1,        1, 2, 3, 4, 5, 6, 7, 8,        8, 7, 6, 5, 4, 3, 2, 1,        1, 2, 3, 4, 5, 6, 7, 8,        1, 2, 3, 4, 5, 6, 7, 8,        1, 2, 3, 4, 5, 6, 7, 8,        8, 7, 6, 5, 4, 3, 2, 1,        1, 2, 3, 4, 5, 6, 7, 8,    };    //定义卷积核矩阵(其实也是一个数组,数组元素的个数3*3)    int const kernel = 3;    //计算卷积输出矩阵的维数(其实是输出数组元素个数的开根号)    int const outm = map - kernel + 1;   //被卷积矩阵的维数-卷积核的维数+1  即8-3+1=6    //计算卷积过程中的被卷积矩阵的宽和高(就是把宽拉成和卷积核的高一样,这样才好对应相乘)    int const convAw = kernel*kernel;//3*3=9    int const convAh = map*map;//8*8=64    float A_convert[convAh*convAw] = { 0 };//定义一个卷积过程中的矩阵(也就是被拉长过后的矩阵)    for (int i = 0; i < outm; i++)    {        for (int j = 0; j < outm; j++)        {            int wh = i * outm * convAw + j * convAw;            int col1 = i * map + j;            A_convert[wh] = A[col1];        //第一次循环时把A[0] 的值赋给 A_convert[0]            A_convert[wh + 1] = A[col1 + 1];//第一次循环时把A[1] 的值赋给 A_convert[1]            A_convert[wh + 2] = A[col1 + 2];//第一次循环时把A[2] 的值赋给 A_convert[2]            int col2 = (i + 1) * map + j;            A_convert[wh + 3] = A[col2];    //第一次循环时把A[8] 的值赋给 A_convert[3]            A_convert[wh + 4] = A[col2 + 1];//第一次循环时把A[9] 的值赋给 A_convert[4]            A_convert[wh + 5] = A[col2 + 2];//第一次循环时把A[10] 的值赋给 A_convert[5]            int col3 = (i + 2) * map + j;            A_convert[wh + 6] = A[col3];     //第一次循环时把A[16] 的值赋给 A_convert[6]            A_convert[wh + 7] = A[col3 + 1]; //第一次循环时把A[17] 的值赋给 A_convert[7]            A_convert[wh + 8] = A[col3 + 2]; //第一次循环时把A[18] 的值赋给 A_convert[8]        }    }    vector<int> C;    for (int i = 0; i < outm; i++)    {        int max;        for (int j = 0; j < outm; j++)        {            int m = i * outm * convAw + j * convAw;            int n;            max = A_convert[m];            for (n = 0; n < convAw; n++)            {                if (A_convert[m + n] > max )                {                    max  = A_convert[m + n];                }           }            C.push_back(max);        }    }    //输出原始输入矩阵    cout << "原始输入矩阵:" << endl;    for (int i = 0; i < map; i++)    {        for (int j = 0; j < map; j++)        {            cout << A[i*map+ j] << " ";        }        cout << endl;    }    cout << endl;    //输出Pooling后矩阵    cout << "Pooling后矩阵:" << endl;    for (int i = 0; i < outm; i++)    {        for (int j = 0; j <outm; j++)        {            cout << C[i*outm + j] << " ";        }        cout << endl;    }    cout << endl;    system("pause");    return 0;}
原创粉丝点击