深度學習_卷積神經網絡_C/C++實現卷積

#include<iostream>
#include<vector>

using namespace std;

int main()
{
	//定義feature map
	int const map = 32;
	float A[map * map]= {0};
	
	//定義卷積矩陣
	int const kernel = 3;
	float B[kernel * kernel] = {0};
	
	//計算卷積輸出矩陣的維數(如果步長爲1,padding爲0)
	int const outmap = map - kernel + 1;
	
	//計算卷積過程中的被卷積矩陣的寬和高(就是把寬拉成和卷積核的高一樣,這樣纔好對應相乘)
	int const convAw = kernel * kernel;
	int const convAh = map * map;

	//定義一個卷積過程中的矩陣
	float A_convert[convAh * convAw] = {0};

	for(int i = 0; i < outmap; i++)
	{
		for(int j = 0; j < outmap; j++)
		{
			int wh = i * outmap * convAw + j * convAw;
			
			int col1 = i * map * j;
			A_convert[wh] = A[col1];
			A_convert[wh + 1] = A[col1 + 1];
			A_convert[wh + 2] = A[col1 + 2];
			
			int col2 = (i + 1) * map + j;
			A_convert[wh + 3] = A[col2];
			A_convert[wh + 4] = A[col2 + 1];
			A_convert[wh + 5] = A[col2 + 2];
			
			int col3 = (i + 2) * map + j;
			A_convert[wh + 6] = A[col3];
			A_convert[wh + 7] = A[col3 + 1];
			A_convert[wh + 8] = A[col3 + 2];
		}
	}
	vector<int> C;
	for(int i = 0; i < outmap; i++)
	{
		for(int j = 0; j < outmap; j++)
		{
			int a = 0;
			int wh = i * outmap * convAw + j * convAw;
			for(int m = 0; m < convAw; m++)
			{
				a += A_convert[wh + m] * B[m];
			}
			C.push_back(a);
		}
	}
	//輸出卷積後的矩陣
	cout << "輸出卷積後的矩陣" << endl;
	for(int i = 0; i < outmap; i++)
	{
		for(int j = 0; j < outmap; j++)
		{
			cout << C[i * outmap + j] << " ";
		}
		cout << endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章