Mercurial > ift6266
diff demo/mlp_conv.c @ 540:269c39f55134
Added demo source files
author | boulanni <nicolas_boulanger@hotmail.com> |
---|---|
date | Wed, 02 Jun 2010 01:34:49 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/demo/mlp_conv.c Wed Jun 02 01:34:49 2010 -0400 @@ -0,0 +1,148 @@ + +#include "AS3.h" +#include <math.h> + +typedef struct { + int n,x,y; + float *w, *b; + int nonlin; // 0aucune,1sigm,2tanh,3softmax + int maxpool; // 01 +} LAYER; + +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} }; +int mod_i[] = {0,2,6}; + +LAYER *L; +int nl; + +float *data, *o; +#define BUF_SIZE 20000 + +static AS3_Val initparam(void* self, AS3_Val args) { + AS3_Val tmp = AS3_Undefined(); + int il, len; + + for (il=0; il < sizeof(models)/sizeof(LAYER); ++il) { + tmp = AS3_Get(args, AS3_Int(2*il)); + len = AS3_IntValue(AS3_GetS(tmp, "length")); + models[il].w = (float*) malloc(len); + AS3_ByteArray_readBytes(models[il].w, tmp, len); + + tmp = AS3_Get(args, AS3_Int(2*il+1)); + len = AS3_IntValue(AS3_GetS(tmp, "length")); + models[il].b = (float*) malloc(len); + AS3_ByteArray_readBytes(models[il].b, tmp, len); + } + + data = (float*) malloc(BUF_SIZE); + o = (float*) malloc(BUF_SIZE); + + return AS3_Int(0); +} + +static AS3_Val choosemodel(void* self, AS3_Val args) { + int il; + + AS3_ArrayValue( args, "IntType", &il ); + + L = models + mod_i[il]; + nl = mod_i[il+1] - mod_i[il]; + + return AS3_Int(0); +} + +static AS3_Val prediction(void* self, AS3_Val args) { + AS3_Val in_arr = AS3_Undefined(), out_arr = AS3_Array(0); + float *tmp, d, e; + int i,j,k,l, n,x,y, newx,newy, il, dx,dy; + LAYER *pL; + + AS3_ArrayValue( args, "AS3ValType", &in_arr ); + + for(i=0; i < 1024; ++i) + data[i] = AS3_IntValue(AS3_Get(in_arr, AS3_Int(4*i+1))) /255.0; + + n = 1; + x = 32; + y = 32; + + #define DATA(l,j,i) data[((l)*y + (j))*x + (i)] + #define O(k,dy,dx) o[((k)*newy + (dy))*newx + (dx)] + #define W(k,l,j,i) pL->w[(((k)*n + (l))*pL->y + (j))*pL->x + (i)] + + for (il=0; il < nl; ++il) { + flyield(); + pL = L+il; + newx = x+1-pL->x; + newy = y+1-pL->y; + + for (dx=0; dx < newx; ++dx) + for (dy=0; dy < newy; ++dy) + for (k=0; k < pL->n; ++k) { + d = pL->b[k]; + for (l=0; l < n; ++l) + for(j=0; j < pL->y; ++j) + for(i=0; i < pL->x; ++i) + d += DATA(l,j+dy,i+dx)*W(k,l,j,i); + O(k,dy,dx) = d; + } + + if(pL->maxpool) { + for (k=0; k < pL->n; ++k) + for (dx=0; dx < newx; dx+=2) + for (dy=0; dy < newy; dy+=2) { + d=O(k,dy,dx); + e=O(k,dy,dx+1); if(e>d) d=e; + e=O(k,dy+1,dx); if(e>d) d=e; + e=O(k,dy+1,dx+1); if(e>d) d=e; + O(k,dy/2,dx/2)=d; + } + newx /= 2; + newy /= 2; + } + + for (dx=0; dx < newx; ++dx) + for (dy=0; dy < newy; ++dy) { + e = 0; + for (k=0; k < pL->n; ++k) { + d = O(k,dy,dx); + if(pL->nonlin==1) d=1.0/(1.0 + exp(-d)); + else if(pL->nonlin==2) d=tanh(d); + else if(pL->nonlin==3) { d=exp(d); e += d; } + O(k,dy,dx) = d; + } + if(pL->nonlin==3 && e) + for (k=0; k < pL->n; ++k) + O(k,dy,dx) /= e; + } + + tmp = data; + data = o; + o = tmp; + + x = newx; + y = newy; + n = pL->n; + } + + for(i=0; i < n*x*y; ++i) + AS3_Set(out_arr, AS3_Int(i), AS3_Number(data[i])); + + return out_arr; +} + +int main() { + AS3_Val initparamMethod = AS3_Function( NULL, initparam ); + AS3_Val choosemodelMethod = AS3_Function( NULL, choosemodel ); + AS3_Val predictionMethod = AS3_FunctionAsync( NULL, prediction ); + + AS3_Val result = AS3_Object( "initparam: AS3ValType, choosemodel: AS3ValType, prediction: AS3ValType", initparamMethod, choosemodelMethod, predictionMethod ); + + AS3_Release( initparamMethod ); + AS3_Release( choosemodelMethod ); + AS3_Release( predictionMethod ); + + AS3_LibInit( result ); + + return 0; +}