在阅读了很多其他人的神经网络代码后,我确信我的代码不对。它工作,我可以训练一个网络只是为了训练隐藏层中的下一个感知器我必须训练最后一个,我不应该能够并行训练隐藏层中的所有单位吗?
以下是计算隐藏层错误的代码:
for(int i=n->numOfPerceptronLayers-2;i>=1;i--) { // for all hidden layers
float sum = 0.0; // <- This here is the problem
for(int j=0;j<n->perceptronLayers[i].numOfPerceptrons;j++) { // For all the units in the current hidden layer
for(int k=0;k<n->perceptronLayers[i].perceptrons[j].numOfConnections;k++) { // Loop through the current units connections to the previous layer (output layer)
sum += n->perceptronLayers[i+1].perceptrons[k].error * n->perceptronLayers[i+1].perceptrons[k].weights[j];
}
n->perceptronLayers[i].perceptrons[j].error = n->perceptronLayers[i].perceptrons[j].output * (1.0 - n->perceptronLayers[i].perceptrons[j].output) * sum;
}
}
它应该是这样的(但这不起作用):
for(int i=n->numOfPerceptronLayers-2;i>=1;i--) { // for all hidden layers
for(int j=0;j<n->perceptronLayers[i].numOfPerceptrons;j++) { // For all the units in the current hidden layer
float sum = 0.0;
for(int k=0;k<n->perceptronLayers[i].perceptrons[j].numOfConnections;k++) { // Loop through the current units connections to the previous layer (output layer)
sum += n->perceptronLayers[i+1].perceptrons[k].error * n->perceptronLayers[i+1].perceptrons[k].weights[j];
}
n->perceptronLayers[i].perceptrons[j].error = n->perceptronLayers[i].perceptrons[j].output * (1.0 - n->perceptronLayers[i].perceptrons[j].output) * sum;
}
}
为什么必须为整个图层声明sum变量而不是单个感知器?
答案 0 :(得分:0)
除非我遗漏了某些内容,否则我认为第一个代码段是错误的,而后一段是正确的。
在第一个代码段中,对整个图层使用单个“sum”变量会导致错误在每个后续感知器处理时累积。因此,感知器j总是会比感知器j-1有更多的错误。
后一个代码修复了这个问题,但是你说它是无效的。唯一可靠的结论是,真正的问题在于代码中的其他地方,因为第一个代码段不应该工作。
除此之外:您确实应该能够并行训练所有层的感知器,因为每个感知器只依赖于它的前向连接以分担错误(在标准的前馈反向传播中)。
答案 1 :(得分:0)
我似乎找到了问题,基本上我的TrainPerceptron(Perceptron * p,浮点误差,浮动动量)函数训练单个感知器通过参数给出了感知器的错误,即使Perceptron结构有错误属性。我正在将error属性传递给函数,但我猜有些东西混淆了,因为在我删除了那个参数后,只是使用了Perceptron结构中存储的错误。