Javascript 神经网络反向传播不工作
我用JavaScript编写了一个神经网络,并实现了所描述的反向传播算法。 下面是代码(typescript): 控制台打印:Javascript 神经网络反向传播不工作,javascript,typescript,machine-learning,neural-network,Javascript,Typescript,Machine Learning,Neural Network,我用JavaScript编写了一个神经网络,并实现了所描述的反向传播算法。 下面是代码(typescript): 控制台打印: Error: 0.0000020735174706210714 [ 0.011556397089327321, 0.9886867357304885 ] 基本上,这很好,对吗 然后,我想教网络XOR问题: import {Net} from './ml'; var myNet = new Net(2, 3, 1); var trainigData = [
Error: 0.0000020735174706210714
[ 0.011556397089327321, 0.9886867357304885 ]
基本上,这很好,对吗
然后,我想教网络XOR问题:
import {Net} from './ml';
var myNet = new Net(2, 3, 1);
var trainigData = [
[0, 0, 0],
[1, 0, 1],
[0, 1, 1],
[1, 1, 0]
]
var error = myNet.train(trainigData)
console.log('Error: ', error);
console.log('Input: 0, 0: ', myNet.getResults(0, 0));
console.log('Input: 1, 0: ', myNet.getResults(1, 0));
此时网络出现故障:
Error: 0.2500007370167383
Input: 0, 0: [ 0.5008584967899313 ]
Input: 1, 0: [ 0.5008584967899313 ]
我做错了什么 首先对整个批次执行梯度检查(在计算批次梯度的函数上测量),如果您还没有这样做的话。这将确保您知道问题所在 如果梯度计算不正确,考虑到您的实现在单个数据集上工作,则很可能在向后过程中混合了一些值 如果正确计算了渐变,则更新函数中存在错误 可以在javaScript中找到神经网络反向传播的工作实现 下面是使用反向传播的trainStep函数的代码片段
function trainStepBatch(details){
//we compute forward pass
//for each training sample in the batch
//and stored in the batch array
var batch=[];
var ks=[];
for(var a=0;a<details.data.in.length;a++){
var results=[];
var k=1;
results[0]={output:details.data.in[a]};
for(var i=1;i<this.layers.length;i++){
results[i]=layers[this.layers[i].type].evalForGrad(this.layers[i],results[i-1].output);
k++;
}
batch[a]=results;
ks[a]=k;
}
//We compute the backward pass
//first derivative of the cost function given the output
var grad=[];
for(i in batch)grad[i]={grad:costs[details.cost].df(batch[i][ks[i]-1].output,details.data.out[i])};
//for each layer we compute the backwards pass
//on the results of all forward passes at a given layer
for(var i=this.layers.length-1;i>0;i--){
var grads=[];
var test=true;
for(a in batch){
grads[a]=layers[this.layers[i].type].grad(this.layers[i],batch[a][i],batch[a][i-1],grad[a]);
if(grads[a]==null)test=false;
else grads[a].layer=i;
}
//we perform the update
if(test)stepBatch(this.layers[i].par,grads,details.stepSize);
}
}
首先对整个批次执行梯度检查(在计算批次梯度的函数上测量),如果您尚未这样做。这将确保您知道问题所在 如果梯度计算不正确,考虑到您的实现在单个数据集上工作,则很可能在向后过程中混合了一些值 如果正确计算了渐变,则更新函数中存在错误 可以在javaScript中找到神经网络反向传播的工作实现 下面是使用反向传播的trainStep函数的代码片段
function trainStepBatch(details){
//we compute forward pass
//for each training sample in the batch
//and stored in the batch array
var batch=[];
var ks=[];
for(var a=0;a<details.data.in.length;a++){
var results=[];
var k=1;
results[0]={output:details.data.in[a]};
for(var i=1;i<this.layers.length;i++){
results[i]=layers[this.layers[i].type].evalForGrad(this.layers[i],results[i-1].output);
k++;
}
batch[a]=results;
ks[a]=k;
}
//We compute the backward pass
//first derivative of the cost function given the output
var grad=[];
for(i in batch)grad[i]={grad:costs[details.cost].df(batch[i][ks[i]-1].output,details.data.out[i])};
//for each layer we compute the backwards pass
//on the results of all forward passes at a given layer
for(var i=this.layers.length-1;i>0;i--){
var grads=[];
var test=true;
for(a in batch){
grads[a]=layers[this.layers[i].type].grad(this.layers[i],batch[a][i],batch[a][i-1],grad[a]);
if(grads[a]==null)test=false;
else grads[a].layer=i;
}
//we perform the update
if(test)stepBatch(this.layers[i].par,grads,details.stepSize);
}
}
你向网络提交了多少次训练数据?@RobertHarvey 2000次。如果我重复多次,错误不会真正改变。@HansMu158 2000次不是很多,尤其是学习率为0.15时。首先用另一个值更改初始权重,同时检查:并将您的结果与it@Carcigenicate100万次之后,准确率仍然大致相同……你向网络提交了多少次训练数据?@RobertHarvey 2000次。如果我重复多次,错误不会真正改变。@HansMu158 2000次不是很多,尤其是学习率为0.15时。首先用其他值更改初始权重,同时检查:并将结果与it@Carcigenicate经过1000000次之后,精度仍然大致相同…
function trainStepBatch(details){
//we compute forward pass
//for each training sample in the batch
//and stored in the batch array
var batch=[];
var ks=[];
for(var a=0;a<details.data.in.length;a++){
var results=[];
var k=1;
results[0]={output:details.data.in[a]};
for(var i=1;i<this.layers.length;i++){
results[i]=layers[this.layers[i].type].evalForGrad(this.layers[i],results[i-1].output);
k++;
}
batch[a]=results;
ks[a]=k;
}
//We compute the backward pass
//first derivative of the cost function given the output
var grad=[];
for(i in batch)grad[i]={grad:costs[details.cost].df(batch[i][ks[i]-1].output,details.data.out[i])};
//for each layer we compute the backwards pass
//on the results of all forward passes at a given layer
for(var i=this.layers.length-1;i>0;i--){
var grads=[];
var test=true;
for(a in batch){
grads[a]=layers[this.layers[i].type].grad(this.layers[i],batch[a][i],batch[a][i-1],grad[a]);
if(grads[a]==null)test=false;
else grads[a].layer=i;
}
//we perform the update
if(test)stepBatch(this.layers[i].par,grads,details.stepSize);
}
}
function stepBatch(params,grads, stepSize){
for(i in params.w){
for(j in params.w[i]){
for(a in grads){
params.w[i][j]-=stepSize*grads[a].dw[i][j];
}
}
}
for(i in params.b){
for(a in grads){
params[a]-=stepSize*grads[a].db[i];
}
}
function stepBatch(params,grads, stepSize){
for(i in params.w){
for(j in params.w[i]){
for(a in grads){
params.w[i][j]-=stepSize*grads[a].dw[i][j];
}
}
}
for(i in params.b){
for(a in grads){
params[a]-=stepSize*grads[a].db[i];
}
}
}