-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmax_pooling.h
98 lines (87 loc) · 2.64 KB
/
max_pooling.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <systemc.h>
#include <macro.h>
SC_MODULE(max_pool) {
sc_in<bool> clk, rst_n;
sc_in<double> featuremap[CONV_ED];
sc_out<double> pooled_featuremap[POOL_ED];
SC_CTOR(max_pool) {
SC_METHOD(max_pooling);
sensitive_pos << clk; // позитивный clock
sensitive_neg << rst_n; // негативный сброс
}
double maximum(double a, double b){
if (a > b) {
return a;
}
else if (a < b) {
return b;
}
else if (a = b) {
return a;
}
return 0;
}
void max_pooling(void) {
double featuremap_in[L3][M3][N3];
for (int k = 0; k < L3; k++) {
for (int i = 0; i < M3; i++) {
for (int j = 0; j < N3; j++) {
featuremap_in[k][i][j]=featuremap[k * N3 * M3 + i * N3 + j].read();//применеяем ReLU
}
}
}
for (int i = 0; i < L3; i++) {
for (int j = 0; j < M3; j++) {
for (int k = 0; k < N3; k++) {
cout << featuremap_in[i][j][k] << " ";
}
cout << endl;
}
cout << "_________" << endl;
}
cout << endl;
cout << "[отладочный вывод][max_pooling] размеры кернела:"<< " P1 = " << P1<< " P2 = " << P2<< endl;
cout << "размеры выходной матрицы: " << endl;
cout << "POOLOUT1= " << POOLOUT1 << " POOLOUT2= " << POOLOUT2 << " POOLOUT3= " << POOLOUT3<< endl;
cout << endl;
// сама операция
double result[POOLOUT3][POOLOUT1][POOLOUT2];
for (int k = 0; k < POOLOUT3; k++) {
for (int i = 0; i < POOLOUT1; i++) {//сдвиг кернела в матрице признаков
for (int j = 0; j < POOLOUT2; j++) {
for (int m = 0; m < P1; m++) {
for (int n = 0; n < P2; n++) {
double value = featuremap_in[k][i * P1 + m][j * P2 + n];
result[k][i][j] = maximum(result[k][i][j], value);
}
double value = 0;
}
}
}
}
cout << "[отладочный вывод][max_pooling] результат" << endl;
for (int k = 0; k < POOLOUT3; k++) {
for (int i = 0; i < POOLOUT1; i++) {
for (int j = 0; j < POOLOUT2; j++) {
cout << result[k][i][j]<<" ";
}
cout << endl;
}
cout << "_________" << endl;
}
cout << endl;
double TEST[POOL_ED];
for (int k = 0; k < POOLOUT3; k++) {
for (int i = 0; i < POOLOUT1; i++) {
for (int j = 0; j < POOLOUT2; j++) {
pooled_featuremap[k * POOLOUT1 * POOLOUT2 + i * POOLOUT1 + j]=result[k][i][j];
}
}
}
//cout<<"@" << sc_time_stamp() <<" pooling layer value calculated"<<endl;
/*for (int j = 0; j < POOL_ED; j++) {
cout << pooled_featuremap[j] << " ";
}
cout << endl;*/
}
};