// Cloned by Jed on 7 Nov 2023 from World "XOR multi-layer network" by "Coding Train" project // Please leave this clone trail here.// XOR multi-layer network// Port from:// https://github.com/CodingTrain/Toy-Neural-Network-JS/tree/master/examples/xor// with modifications // libraries from:// https://github.com/CodingTrain/Toy-Neural-Network-JS/tree/master/lib// ported to here:// https://ancientbrain.com/uploads.php?userid=codingtrain //=== Tweaker's box ============================================// number of nodes in each layer:const noinput =2;// 2const nohidden =6;// 6const nooutput =1;// 1// define the exemplars to learn from:
let training_data =[{ inputs:[0,0], outputs:[0]},{ inputs:[0,1], outputs:[1]},{ inputs:[1,0], outputs:[1]},{ inputs:[1,1], outputs:[0]}];var nn;// global var // originally 0.2const learningrate =0.2;// train this number of times per draw()const notrain =10;// Take screenshot on this step:
AB.screenshotStep =200;// divide 0,1 into squares // show all squares or just the corner squares:var showall =true;const canvassize =400;const squaresize =40;const cols =10;const rows =10;// Matrix.randomize() is changed to point to this. Must be defined by user of Matrix. function randomWeight(){//return ( 0 );//return ( 0.5 );//return ( -0.5 );//return ( 5.0 );//originalreturn( AB.randomFloatAtoB (-0.5,0.5));//return ( AB.randomIntAtoB ( -10, 10 ) );// Coding Train default is -1 to 1}//=== End of tweaker's box ============================================function setup(){
createCanvas (canvassize, canvassize);
$.getScript ("/uploads/walshej7/matrix.js",function(){
$.getScript ("/uploads/walshej7/nn.js",function(){
nn =newNeuralNetwork( noinput, nohidden, nooutput );});});}function draw(){// check if libraries loaded yet:if(typeof nn =='undefined')return;
nn.setLearningRate ( learningrate );
background ('#ffffcc');// train n times for(let i =0; i < notrain ; i++){
let data = random ( training_data );
nn.train ( data.inputs, data.outputs );}// draw either some squares or all squares:if( showall ){// redraw all squares each time roundfor(let i =0; i < cols; i++)for(let j =0; j < rows; j++)
drawsquare ( i, j );}else{// redraw just the 4 squares for( let i =0; i < cols; i = i + cols-1)for( let j =0; j < rows; j = j + rows-1)
drawsquare ( i, j );}}function drawsquare ( i, j ){
let x1 = i / cols;
let x2 = j / rows;
let inputs =[x1, x2];
let y = nn.predict(inputs);//console.log ( "input (" +x1 + "," + x2 + ") output " + y );
strokeWeight(2);
stroke('black');
fill ( y *255);// 0 is black, 1 is white
rect ( i * squaresize, j * squaresize, squaresize, squaresize );return`<li>input (${x1}, ${x2}) output ${Math.round(y*100)/100}</li>`}