训练神经网络识别与/或/非的操作
很久没有更新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));