|
|
 |
Neural Networks and WebGPU Compute..
Learning from Data..... |
|
|
|
 | Happy or Sad Smiley Face |  |
• Network (48*48,15,15,2)
 | Complete Code |  |
// Learning smiley - deep neural network setup
// (48x48) pixel values (input)
// (15,15) hidden layers
// (2) sad or happy
await xinitialize( {layers:[2304,15,15,2], build:'cpu', learningrate:0.1} );
let div = document.createElement('div');
document.body.appendChild( div );
div.innerHTML = `
<br><br>
<canvas id="mycanvas" width="48" height="48" style="border:1px solid #ff0000;"> </canvas>
<br><br>
<div id="counter">Iteration:</div>
<br>
<div id="result">Result/Output:</div>
`;
var canvas = null;
var context = null;
var iteration = 0;
var data = []
var imgs = []
// hard coded 20 test images loaded in (pixel data)
for (let v=0; v<20; ++v)
{
// 10 happy and 10 sad faces
let suf = "h0" + v;
if (v>=10) suf = 's0' + (v-10);
let imgFileName = "https://webgpulab.xbdev.net/var/images/smileys/" + suf + ".jpg";
imgs[v] = new Image();
imgs[v].src = imgFileName;
imgs[v].onload = function() {
canvas = canvas || document.getElementById('mycanvas');
context = context || canvas.getContext('2d');
canvas.width = this.width;
canvas.height = this.height;
context.drawImage(this, 0, 0);
console.log("Dimensions: " + this.width + 'x' + this.height);
let imgData = context.getImageData(0, 0, 48, 48).data;
// convert rgba to an array of scalar values
graydata = []
for (let kk=0; kk<imgData.length; kk+=4)
{
// scale our imaeg data 0.0 to 1.0
graydata.push( imgData[kk] / 255.0 );
}
if ( v < 10 )
data.push( { number:v, datain:graydata, dataout:[1,0] } );
else
data.push( { number:v, datain:graydata, dataout:[0,1] } );
console.log( data[ data.length-1 ].dataout )
if ( v >= 18 )
{
console.log('All images loaded');
}
}
}// end loop(..)
async function preview(){
// check if data/images is still loading
if ( data.length < 20 )
{
requestAnimationFrame(preview);
return;
}
const testImage = 14;
//console.log( data.length );
iteration++;
var elem = document.getElementById('counter');
elem.innerHTML = "Iteration: " + iteration;
// e.g., which test image you're using, h02.jpg as the test image
var result = await xactivate( data[ testImage ].datain );
var resElm = document.getElementById('result');
var face = "happy";
if ( result[1] > result[0] ) face = "sad";
resElm.innerHTML = "Result (" + face + ") '[happy:[1,0], sad[0,1]]}: '" + result;
canvas = canvas || document.getElementById('mycanvas');
context = context || canvas.getContext('2d');
var imageData = context.getImageData(0, 0, 48, 48);
for (let kk=0; kk<48*48; kk=kk+1)
{
imageData.data[kk*4 + 0] = data[ testImage ].datain[kk] * 255.0;
imageData.data[kk*4 + 1] = data[ testImage ].datain[kk] * 255.0;
imageData.data[kk*4 + 2] = data[ testImage ].datain[kk] * 255.0;
//imageData.data[kk*4 + 3] = 255;
}
context.putImageData(imageData,0,0, 0, 0, 48,48);
requestAnimationFrame(iterate);
}
/*
Keep training the neural network to improve its accuracy
*/
async function iterate(){
for (var i=0; i<20; ++i)
{
var dynamicRate = .01/(1+.0005*iteration);
await xactivate( data[i].datain );
await xpropagate( data[i].dataout, dynamicRate );
}
await preview();
}
preview();
 | Resources and Links |  |
• WebGPU Lab Demo [LINK]
|
|