-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbp.c
120 lines (108 loc) · 2.63 KB
/
bp.c
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "bp.h"
void update_fc2_b()
{
for(int i=0;i<FC2_SIZE;i++)
{
fc2_delta[i]=alpha*C[i]*(fc2_a[i]*(1.0-fc2_a[i]));
fc2_db[i]+=fc2_delta[i];
}
}
void update_fc2_w()
{
for(int i=0;i<FC2_SIZE;i++)
for(int j=0;j<FC1_SIZE;j++)
fc2_dw[i][j]+=fc2_delta[i]*fc1_a[j];
}
void update_fc1_b()
{
for(int i=0;i<FC1_SIZE;i++)
{
float error=0;
for(int j=0;j<FC2_SIZE;j++)
error+=fc2_delta[j]*fc2_w[j][i];
fc1_delta[i]=error*(fc1_a[i]*(1.0-fc1_a[i]));
fc1_db[i]+=fc1_delta[i];
}
}
void update_fc1_w()
{
for(int i=0;i<FC1_SIZE;i++)
for(int j=0;j<CONV_W_NUM;j++)
for(int k=0;k<POOL_SIZE;k++)
for(int l=0;l<POOL_SIZE;l++)
fc1_dw[i][j][k][l]+=fc1_delta[i]*pool[j][k][l];
}
void update_conv_b()
{
for(int i=0;i<CONV_W_NUM;i++)
{
conv_sigma_delta[i]=0;
for(int j=0;j<POOL_SIZE;j++)
for(int k=0;k<POOL_SIZE;k++)
{
float error=0;
conv_delta[i][j][k]=0;
for(int l=0;l<FC1_SIZE;l++)
error+=fc1_delta[l]*fc1_w[l][i][j][k];
conv_delta[i][j][k]=error*(pool[i][j][k]*(1.0-pool[i][j][k]));
conv_sigma_delta[i]+=error*(pool[i][j][k]*(1.0-pool[i][j][k]));
}
conv_db[i]+=conv_sigma_delta[i];
}
}
void update_conv_w()
{
for(int i=0;i<CONV_W_NUM;i++)
for(int j=0;j<CONV_W_SIZE;j++)
for(int k=0;k<CONV_W_SIZE;k++)
{
float error=0;
for(int m=0;m<POOL_SIZE;m++)
for(int n=0;n<POOL_SIZE;n++)
{
int x=pool_pos[i][m][n]/2;
int y=pool_pos[i][m][n]%2;
error+=conv_delta[i][m][n]*input[2*m+j+x][2*n+k+y];
}
conv_dw[i][j][k]+=error;
}
}
void assign_grads()
{
for(int i=0;i<FC2_SIZE;i++)
{
fc2_b[i]-=(fc2_db[i]/minibatch);
fc2_db[i]=0;
}
for(int i=0;i<FC2_SIZE;i++)
for(int j=0;j<FC1_SIZE;j++)
{
fc2_w[i][j]-=(fc2_dw[i][j]/minibatch);
fc2_dw[i][j]=0;
}
for(int i=0;i<FC1_SIZE;i++)
{
fc1_b[i]-=(fc1_db[i]/minibatch);
fc1_db[i]=0;
}
for(int i=0;i<FC1_SIZE;i++)
for(int j=0;j<CONV_W_NUM;j++)
for(int k=0;k<POOL_SIZE;k++)
for(int l=0;l<POOL_SIZE;l++)
{
fc1_w[i][j][k][l]-=(fc1_dw[i][j][k][l]/minibatch);
fc1_dw[i][j][k][l]=0;
}
for(int i=0;i<CONV_W_NUM;i++)
{
conv_b[i]-=(conv_db[i]/minibatch);
conv_db[i]=0;
}
for(int i=0;i<CONV_W_NUM;i++)
for(int l=0;l<CONV_W_SIZE;l++)
for(int m=0;m<CONV_W_SIZE;m++)
{
conv_w[i][l][m]-=(conv_dw[i][l][m]/minibatch);
conv_dw[i][l][m]=0;
}
}