【C++コード】ボリューム、プール化、アクティブ化関数

32782 ワード

#include 
#include 
#include 
using namespace std;

//     
vector<vector<int>> Filtering(vector<vector<int>> image, vector<vector<int>> filter)
{
    int image_row = image.size();
    int image_col = image[0].size();
    int filter_row = filter.size();
    int filter_col = filter[0].size();
    vector<vector<int>> result;
    vector<int> temp;
    for (int i = 0; i < image_row - filter_row + 1; i++)
    {
        for (int j = 0; j < image_col - filter_col + 1; j++)
        {
            int sum = 0;
            for (int m = 0; m < filter_row; m++)
            {
                for (int n = 0; n < filter_col; n++)
                {
                    sum += image[i + m][j + n] * filter[m][n];

                }
            }
            temp.push_back(sum);
        }
        result.push_back(temp);
        temp.clear();
    }
    return result;
}

//     
vector<vector<int>> Pooling(vector<vector<int>> image, int row = 2, int column = 2)
{
    vector<vector<int>> result;
    vector<int> temp;
    int image_row = image.size();
    int image_col = image[0].size();
    for (int i = 0; i < image_row; i += row)
    {
        for (int j = 0; j < image_col; j += column)
        {
            vector<int> sub_temp;
            for (int m = 0; m < row; m++)
            {
                for (int n = 0; n < column; n++)
                {
                    sub_temp.push_back(image[i + m][j + n]);
                }
            }
            temp.push_back(*max_element(sub_temp.begin(), sub_temp.end()));
            sub_temp.clear();
        }
        result.push_back(temp);
        temp.clear();
    }
    return result;
}
// RELU 
int RELU(int x)
{
    return x > 0 ? x : 0;
}
//     ,         
void Activation(vector<vector<int>> & image)
{
    int image_row = image.size();
    int image_col = image[0].size();
    for (int i = 0; i < image_row; i++)
    {
        for (int j = 0; j < image_col; j++)
        {
            image[i][j] = RELU(image[i][j]);
        }
    }
}



int main()
{
    vector<vector<int>> image(10);
    for (int i = 0; i < image.size(); i++)
    {
        image[i].resize(10);
    }
    int row = image.size();
    int col = image[0].size();
    cout << "The matrix of image : " << endl;
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            image[i][j] = i + j;
            cout << image[i][j] << '\t'; 
        }
        cout << endl;
    }
    cout << "The matrix of filter : " << endl;
    vector<vector<int>> filter(3);
    for (int i = 0; i < filter.size(); i++)
    {
        filter[i].resize(3);
    }
    int filter_row = filter.size();
    int filter_col = filter[0].size();
    for (int i = 0; i < filter_row; i++)
    {
        for (int j = 0; j < filter_col; j++)
        {
            filter[i][j] = 1;
            cout << filter[i][j] << '\t';
        }
        cout << endl;
    }
    cout << "THe matrix of image after convolution : " << endl;
    vector<vector<int>> temp = Filtering(image, filter);
    for (int i = 0; i < temp.size(); i++)
    {
        for (int j = 0; j < temp[0].size(); j++)
        {
            cout << temp[i][j] << '\t';
        }
        cout << endl;
    }
    cout << "THe matrix of image after pooling : " << endl;
    vector<vector<int>> sub_temp = Pooling(temp);
    for (int i = 0; i < sub_temp.size(); i++)
    {
        for (int j = 0; j < sub_temp[0].size(); j++)
        {
            cout << sub_temp[i][j] << '\t';
        }
        cout << endl;
    }
    cout << "The matrix of image after Activation layer : " << endl;
    Activation(sub_temp);
    for (int i = 0; i < sub_temp.size(); i++)
    {
        for (int j = 0; j < sub_temp[0].size(); j++)
        {
            cout << sub_temp[i][j] << '\t';
        }
        cout << endl;
    }
    return 0;
}