annotate demo/mlp_conv.c @ 613:5e481b224117

fix the reading of PNIST dataset following Dumi compression of the data.
author Frederic Bastien <nouiz@nouiz.org>
date Thu, 06 Jan 2011 13:57:05 -0500
parents 269c39f55134
children
rev   line source
540
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
1
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
2 #include "AS3.h"
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
3 #include <math.h>
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
4
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
5 typedef struct {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
6 int n,x,y;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
7 float *w, *b;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
8 int nonlin; // 0aucune,1sigm,2tanh,3softmax
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
9 int maxpool; // 01
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
10 } LAYER;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
11
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
12 LAYER models[] = { {500,32,32,0,0,2,0},{62,1,1,0,0,3,0}, {1000,32,32,0,0,1,0},{1000,1,1,0,0,1,0},{1000,1,1,0,0,1,0},{62,1,1,0,0,1,0} };
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
13 int mod_i[] = {0,2,6};
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
14
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
15 LAYER *L;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
16 int nl;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
17
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
18 float *data, *o;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
19 #define BUF_SIZE 20000
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
20
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
21 static AS3_Val initparam(void* self, AS3_Val args) {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
22 AS3_Val tmp = AS3_Undefined();
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
23 int il, len;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
24
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
25 for (il=0; il < sizeof(models)/sizeof(LAYER); ++il) {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
26 tmp = AS3_Get(args, AS3_Int(2*il));
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
27 len = AS3_IntValue(AS3_GetS(tmp, "length"));
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
28 models[il].w = (float*) malloc(len);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
29 AS3_ByteArray_readBytes(models[il].w, tmp, len);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
30
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
31 tmp = AS3_Get(args, AS3_Int(2*il+1));
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
32 len = AS3_IntValue(AS3_GetS(tmp, "length"));
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
33 models[il].b = (float*) malloc(len);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
34 AS3_ByteArray_readBytes(models[il].b, tmp, len);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
35 }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
36
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
37 data = (float*) malloc(BUF_SIZE);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
38 o = (float*) malloc(BUF_SIZE);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
39
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
40 return AS3_Int(0);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
41 }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
42
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
43 static AS3_Val choosemodel(void* self, AS3_Val args) {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
44 int il;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
45
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
46 AS3_ArrayValue( args, "IntType", &il );
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
47
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
48 L = models + mod_i[il];
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
49 nl = mod_i[il+1] - mod_i[il];
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
50
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
51 return AS3_Int(0);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
52 }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
53
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
54 static AS3_Val prediction(void* self, AS3_Val args) {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
55 AS3_Val in_arr = AS3_Undefined(), out_arr = AS3_Array(0);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
56 float *tmp, d, e;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
57 int i,j,k,l, n,x,y, newx,newy, il, dx,dy;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
58 LAYER *pL;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
59
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
60 AS3_ArrayValue( args, "AS3ValType", &in_arr );
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
61
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
62 for(i=0; i < 1024; ++i)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
63 data[i] = AS3_IntValue(AS3_Get(in_arr, AS3_Int(4*i+1))) /255.0;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
64
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
65 n = 1;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
66 x = 32;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
67 y = 32;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
68
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
69 #define DATA(l,j,i) data[((l)*y + (j))*x + (i)]
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
70 #define O(k,dy,dx) o[((k)*newy + (dy))*newx + (dx)]
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
71 #define W(k,l,j,i) pL->w[(((k)*n + (l))*pL->y + (j))*pL->x + (i)]
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
72
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
73 for (il=0; il < nl; ++il) {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
74 flyield();
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
75 pL = L+il;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
76 newx = x+1-pL->x;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
77 newy = y+1-pL->y;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
78
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
79 for (dx=0; dx < newx; ++dx)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
80 for (dy=0; dy < newy; ++dy)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
81 for (k=0; k < pL->n; ++k) {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
82 d = pL->b[k];
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
83 for (l=0; l < n; ++l)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
84 for(j=0; j < pL->y; ++j)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
85 for(i=0; i < pL->x; ++i)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
86 d += DATA(l,j+dy,i+dx)*W(k,l,j,i);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
87 O(k,dy,dx) = d;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
88 }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
89
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
90 if(pL->maxpool) {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
91 for (k=0; k < pL->n; ++k)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
92 for (dx=0; dx < newx; dx+=2)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
93 for (dy=0; dy < newy; dy+=2) {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
94 d=O(k,dy,dx);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
95 e=O(k,dy,dx+1); if(e>d) d=e;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
96 e=O(k,dy+1,dx); if(e>d) d=e;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
97 e=O(k,dy+1,dx+1); if(e>d) d=e;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
98 O(k,dy/2,dx/2)=d;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
99 }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
100 newx /= 2;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
101 newy /= 2;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
102 }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
103
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
104 for (dx=0; dx < newx; ++dx)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
105 for (dy=0; dy < newy; ++dy) {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
106 e = 0;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
107 for (k=0; k < pL->n; ++k) {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
108 d = O(k,dy,dx);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
109 if(pL->nonlin==1) d=1.0/(1.0 + exp(-d));
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
110 else if(pL->nonlin==2) d=tanh(d);
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
111 else if(pL->nonlin==3) { d=exp(d); e += d; }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
112 O(k,dy,dx) = d;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
113 }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
114 if(pL->nonlin==3 && e)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
115 for (k=0; k < pL->n; ++k)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
116 O(k,dy,dx) /= e;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
117 }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
118
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
119 tmp = data;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
120 data = o;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
121 o = tmp;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
122
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
123 x = newx;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
124 y = newy;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
125 n = pL->n;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
126 }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
127
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
128 for(i=0; i < n*x*y; ++i)
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
129 AS3_Set(out_arr, AS3_Int(i), AS3_Number(data[i]));
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
130
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
131 return out_arr;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
132 }
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
133
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
134 int main() {
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
135 AS3_Val initparamMethod = AS3_Function( NULL, initparam );
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
136 AS3_Val choosemodelMethod = AS3_Function( NULL, choosemodel );
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
137 AS3_Val predictionMethod = AS3_FunctionAsync( NULL, prediction );
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
138
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
139 AS3_Val result = AS3_Object( "initparam: AS3ValType, choosemodel: AS3ValType, prediction: AS3ValType", initparamMethod, choosemodelMethod, predictionMethod );
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
140
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
141 AS3_Release( initparamMethod );
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
142 AS3_Release( choosemodelMethod );
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
143 AS3_Release( predictionMethod );
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
144
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
145 AS3_LibInit( result );
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
146
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
147 return 0;
269c39f55134 Added demo source files
boulanni <nicolas_boulanger@hotmail.com>
parents:
diff changeset
148 }