#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;
}
深度學習_卷積神經網絡_C/C++實現卷積
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.