This is boltz.m in view mode; [Download] [Up]
#import "Neuron.h" #import "Random.h" #import <math.h> #define N 4 // number of neurons #define I 3 // input neurons #define O 1 // output neurons #define PREFACT ETA void main() { id random = [[Random alloc] init]; int i,j,k,n; id neuron; id nList = [[List alloc] init]; int update_list[N]; double inputs[I]; double target[O]; long count; int K = 10; double T = 100.0, Tf = 0.1, ETA = 0.1, Gamma = 0.995, E = 0.0; // // create the neurons // for(i=0; i<N; i++) { [nList addObject:[[[[[[Neuron alloc] init] setRandom:random] setType:Tanh] setTemp:T] setSymmetric:YES]]; } // // make the connections (fully-connected) // for(i=0; i<N; i++) for(j=0; j<N; j++) if(j!=i) [[nList objectAt:i] connect:[nList objectAt:j] withWeight:(1.0 - 2.0*[random percent])]; while( T > Tf ) { for(k=0;k<K;k++) { // // apply inputs // for(i=0; i<I; i++) { inputs[i] = [random percent] > 0.5 ? -1 : 1; } inputs[2] = 1.0; target[0] = (inputs[0] == inputs[1] ? 1.0 : -1.0); for(i=0; i<I; i++) [[nList objectAt:i] setOutput:inputs[i]]; // // clamp outputs // for(i=I; i<I+O; i++) [[nList objectAt:i] setOutput:target[i-I]]; // // do "clamped" training // for(i=0; i<N; i++) { // loop over hidden nodes update_list[i] = n = [random randMin:I max:(N-1)]; neuron = [nList objectAt:n]; if(n > I+O) // don't unclamp outputs [neuron step]; for(j=0; j<N; j++) { if(j!=n) { [neuron changeWeightFor:[nList objectAt:j] by:(PREFACT)*[neuron lastOutput]* [[nList objectAt:j] lastOutput]]; } } } // // do "free" (un)learning // for(i=I; i<N; i++) [[nList objectAt:i] step]; // unclamp outputs for(i=0; i<N; i++) { // loop over all nodes n = update_list[i]; neuron = [nList objectAt:n]; [neuron step]; for(j=0; j<N; j++) { if(j!=n) { [neuron changeWeightFor:[nList objectAt:j] by:-(PREFACT)*[neuron lastOutput]* [[nList objectAt:j] lastOutput]]; } } } if((count %1) == 0) { for(i=0; i<O; i++) E += (0.5/O)*fabs(target[i] - [[nList objectAt:I+i] lastOutput]); if(E == 0.0) E = MINFLOAT; } } printf("%e %e\n",T,E); E=0.0; T = Gamma*T; for(i=0; i<N; i++) [[nList objectAt:i] setTemp:T]; } // // dump the weights // for(i=0; i<N; i++) { neuron = [nList objectAt:i]; for(j=0; j<N; j++) if(j!=i) printf("%e ",[neuron getWeightFor:[nList objectAt:j]]); printf("\n"); } printf("ETA: %e K: %u Gamma: %e\n",ETA,K,Gamma); printf("N: %u I: %u O: %u\n",N,I,O); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.