训练神经网络识别与/或/非的操作

很久没有更新Blog了,刚好学习了神经网络,来更新一下
我是跟着这个视频学习的,感兴趣的同学可以来学习一下
带你用”小学数学”读懂人工智能、机器学习、神经网络
用原生js写一个神经网络
贴上自己的代码吧

const datas=[
    [[0,0],0],
    [[0,1],0],
    [[1,0],0],
    [[1,1],1],
]; 

const weights=[];
for(let i=0;i<3;i++)
{
    weights[i]=Math.random()-0.5;    
}
 
//神经网络开始
//计算神经网络
function calcOutput(inputs){
    let output=inputs[0]*weights[0]+inputs[1]*weights[1]+1*weights[2];
    return sigmoid(output);
}


//计算误差大小
function errorRate(output,excepted){
    return Math.abs(output-excepted);
}

function sigmoid(x){
    return 1/(1+Math.pow(Math.E,-x));
}


//试着调整每个权重
const d=0.00001;
//计算最近n次的错误率平均值
const errors=[];
const maxError=20;
let times=1;
const threshold=0.0001;
function calcError(error){ 
    errors.push(error);
    if(errors.length>maxError){
        errors.shift();
    }
    return errors.reduce((tmp,item)=>tmp+item)/errors.length;

}


//训练率的步长
const trainRate=0.1;
function train(inputs,excepted){ 
     

    let error=errorRate(calcOutput(inputs),excepted);

    

    //调整每个权重,增加一个极小的值
    //再次计算新的错误率,如果错误率比原来更大了,说明调整反了,需要为负调整,如果变小了,就是正确的。
    const dw=[];
    weights.forEach((w,i)=> {
        weights[i]+=d;

        let error2=errorRate(calcOutput(inputs),excepted);
        

        dw[i]=(error2-error)/d; 
        weights[i]=w;
    });

    weights.forEach((w,i)=> {
        weights[i]-=dw[i]*trainRate;
    });
    
    let e=calcError(error);

    times++;

    if(times%5000==0){
        console.log(`#${times} ${e}`);

    }

    return e<=threshold; 

    
}
    for(let i=0;;i++){
        let data=datas[i%datas.length];
       if( train(data[0],data[1])==true){
           break;
       };
    }

    console.log(weights);
    console.log(sigmoid(-19));

训练错误率达到0.01%
可以看到在不断的训练下,错误率可以达到万分之一甚至更低!