Advertisement
gufoe

Javascript Neural Network (feed forward)

Jun 18th, 2014
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Constructor A:
  3.  * @param structure (ex. [4, 3, 2] 4 neurons in the input layer, 3 in the hidden layer and 2 in the output layer)
  4.  *
  5.  * Contructor B:
  6.  * @param Brain dad
  7.  * @param Brain mom
  8.  * @param float mutation rate (0 = 0%, 1 = 100%)
  9.  *
  10.  * Examples:
  11.  * to generate a new brain, use: new Brain([4, 3, 2])
  12.  * to clone a brain, use: new Brain(brain_to_clone, brain_to_clone, 0)
  13.  *
  14.  */
  15. var Brain = function(a, b, mrate) {
  16.    
  17.     // The mutation rate, will be set later
  18.     this.mrate = 0;
  19.    
  20.     this.network;
  21.     this.outputs;
  22.     this.inputs;
  23.  
  24.     if (b == null) {
  25.         // Generate a new brain
  26.         var struct = a;
  27.         this.network = new Array(struct.length-1);
  28.         this.outputs = new Array(this.network.length);
  29.        
  30.         for(var l = 0; l < struct.length-1; l++) {
  31.             this.network[l] = new Array(struct[l+1]);
  32.             this.outputs[l] = new Array(this.network[l].length);
  33.            
  34.             var syn = struct[l] + 1;
  35.            
  36.             for(var n = 0; n < this.network[l].length; n++) {
  37.                 this.network[l][n] = new Array(syn);
  38.                 for(var w = 0; w < syn; w++) {
  39.                     this.outputs[l][n] = 1;
  40.                     this.network[l][n][w] = Brain.genWeight(1);
  41.                 }
  42.             }
  43.         }
  44.     } else {
  45.        
  46.         // Generate a new brain given its parents
  47.         var dad = a,
  48.             mom = b;
  49.        
  50.         if (mrate == null) {
  51.             this.mrate = dad.mrate;
  52.         } else {
  53.             this.mrate = mrate;
  54.         }
  55.        
  56.         var d = dad.network;
  57.         var m = mom.network;
  58.         var src;
  59.        
  60.         this.network = new Array(dad.network.length);
  61.         this.outputs = new Array(this.network.length);
  62.        
  63.         for(var l = 0; l < this.network.length; l++) {
  64.            
  65.             this.network[l] = new Array(d[l].length);
  66.             this.outputs[l] = new Array(this.network[l].length);
  67.            
  68.             for(var n = 0; n < this.network[l].length; n++) {
  69.                
  70.                 this.network[l][n] = new Array(d[l][n].length);
  71.                
  72.                 src = Math.random() < .5 ? d[l][n] : m[l][n];
  73.                
  74.                 for(var w = 0; w < this.network[l][n].length; w++)
  75.                     this.network[l][n][w] = src[w] + (Math.random()*100 < this.mrate ? Brain.genWeight(.5) : 0);
  76.             }
  77.         }
  78.     }
  79.    
  80.     // This is used to calculate the network outputs
  81.     this.process = function(inp) {
  82.         this.inputs = inp;
  83.         for(var l = 0; l < this.network.length; l++) {
  84.            
  85.             if(l > 0)
  86.                 inp = this.outputs[l-1];
  87.                
  88.             for(var n = 0; n < this.network[l].length; n++) {
  89.                 this.outputs[l][n] = 0;
  90.                 for(var w = 0; w < this.network[l][n].length-1; w++) {
  91.                     this.outputs[l][n]+= inp[w] * this.network[l][n][w];
  92.                 }
  93.                 this.outputs[l][n]+= this.network[l][n][this.network[l][n].length-1];
  94.                
  95.                 this.outputs[l][n] = this.activate(this.outputs[l][n]);
  96.             }
  97.            
  98.         }
  99.        
  100.         return this.outputs[this.outputs.length-1];
  101.     }
  102.    
  103.     // Get the last outputs
  104.     this.getOutputs = function() {
  105.         return this.outputs[this.outputs.length-1];
  106.     }
  107.    
  108.     // The activation function
  109.     this.activate = function(x) {
  110.         //return Math.sin(x*10.0);
  111.         if(x > 40)
  112.             return 1;
  113.         if(x < -40)
  114.             return -1;
  115.         return 2.0/(1 + Math.exp(-x))-1;
  116.     }
  117.    
  118.     // Clone a brain
  119.     this.clone = function() {
  120.         return new Brain(this, this, 0);
  121.     }
  122.    
  123.     // Get the number of inputs
  124.     this.inputs = function() {
  125.         return this.network[0][0].length-1;
  126.     }
  127. }
  128.  
  129. // Generate a random number between -factor and +factor
  130. Brain.genWeight = function(factor) {
  131.     return (factor?factor:1)*(1-Math.random()*2);
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement