【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;
}