javascript - JavaScript:简单的感知器预测异或门错误
问题描述
这段 JavaScript 代码代表了神经网络中简单感知器的概念。下面的代码预测除XOR 表之外的所有真值表都很好。请在浏览器的控制台窗口中运行此代码并找出问题所在。
由于这是一个简单的单个神经元,因此我没有对隐藏层给予太多重视。我正在训练这个高达 10,000 次迭代以获得更好的结果。
//AND GATE
var X1 = [0,1,1,0];
var X2 = [0,1,0,1];
var OUT = [0,1,0,0];
/*
//AND GATE
var X1 = [0,1,1,0];
var X2 = [0,1,0,1];
var OUT = [0,1,0,0];
//OR GATE
var X1 = [0,1,1,0];
var X2 = [0,1,0,1];
var OUT = [0,1,1,1];
//NAND GATE
var X1 = [0,1,1,0];
var X2 = [0,1,0,1];
var OUT = [1,0,1,1];
//NOR GATE
var X1 = [0,1,1,0];
var X2 = [0,1,0,1];
var OUT = [1,0,0,0];
//XOR GATE
var X1 = [0,1,1,0];
var X2 = [0,1,0,1];
var OUT = [0,0,1,1];
*/
var LR = 0.01; //Learning rate to speedup learning process.
var BIAS = 1; // Avoid sum become zero.
var TRAIN = 10000; //Epochs we need to run for accurate result
var WEIGHTS = [Math.random(),Math.random(),Math.random()]; //3 Random weights 2 for input & 1 for bias
//console.log("Initial Weights : "+WEIGHTS);
function neuron(x1,x2,out){
var sum = 0;
var error = 0;
//Sum of weighted x1,x2 and bias
sum = x1*WEIGHTS[0] + x2*WEIGHTS[1] + BIAS*WEIGHTS[2];
//Heaviside step function as activation function
if(sum>1){
sum = 1;
}else{
sum = 0;
}
//Calculate the error
error = out - sum;
//Adjust weights
WEIGHTS[0] = WEIGHTS[0] + error * x1 * LR;
WEIGHTS[1] = WEIGHTS[1] + error * x2 * LR;
WEIGHTS[2] = WEIGHTS[2] + error * BIAS * LR;
//console.log("Weights adjust : "+WEIGHTS);
}
function Train(){
//Epoch iteration eg- 10000 is good
for(var k=1;k<=TRAIN;k++){
//Train Four sets of truth table
for(var i=0;i<X1.length;i++){
neuron(X1[i],X2[i],OUT[i]);
}
}
}
function Predict(x1,x2){
var predict = 0;
predict = x1*WEIGHTS[0] + x2*WEIGHTS[1] + BIAS*WEIGHTS[2];
if(predict>1){
predict = 1;
}else{
predict = 0;
}
//Predict for given input
console.log("The prediction for "+(x1+","+x2)+" is "+predict);
}
//First train the perceptron
Train();
//Predict for given input
Predict(1,1);
Predict(0,0);
Predict(1,0);
Predict(0,1);
异或门的输出是
The prediction for 1,1 is 1
The prediction for 0,0 is 1
The prediction for 1,0 is 1
The prediction for 0,1 is 1
解决方案
推荐阅读
- reactjs - sh:反应脚本:找不到命令
- database - 我可以根据计算或其他字段修复 Access 数据库中的查找字段吗?
- java - 如何使用 JDBC 实现 DataTables 的服务器端处理,使其分页?
- typo3 - 创建 ObjectStorage 实例的问题
- r - 如何仅将矩阵的奇数行相乘,同时仍保留偶数行?
- javascript - Javascript 差异桌面和移动
- c++ - 将对象创建为全局/静态对象会崩溃,而本地对象不会
- ruby-on-rails - 从 `form_for` 迁移到新的 `form_with`
- python - 不使用 Django 默认登录表单创建登录页面
- biztalk - BizTalk 2013R2:为什么我的业务流程在根据业务流程调试器终止后初始化?