我正在忙着在java中创建一个基本的神经网络,有三个输入,一个隐藏层有两个隐藏神经元和一个输出神经元。我之前做过一个较小的一个有三个输入和一个输出但没有隐藏层,我用过使用公式(预测目标)^ 2计算用于反向传播的一些基本计算和成本。这两个NN都不使用像sigmoid这样的激活函数,因为它们预测的是值,而不是二进制输出。
当我尝试用隐藏层训练我更大的NN时,我的问题就出现了。我用于第一个的基本微积分方法不起作用。
有人可以通过告诉我如何使用隐藏层训练NN来帮助我吗? (数学公式)
答案 0 :(得分:0)
This video应该是一个很好的资源!如果您只对数学公式感兴趣,可以跳到第二部分的末尾。如果您想知道如何更新权重,我建议您观看这两个视频。使用此视频,我开发了以下算法:
public void applyBackpropagation(double expectedOutput[]){
for (int i = 0; i < expectedOutput.length; i++) {
double d = expectedOutput[i];
if (d < 0 || d > 1) {
if (d < 0)
expectedOutput[i] = 0 + epsilon;
else
expectedOutput[i] = 1 - epsilon;
}
}
int i = 0;
for(Neuron n : outputLayer){
ArrayList<Connection> connections = n.getAllInConnections();
double Ok = n.getOutput();
double tk = expectedOutput[i];
double dk = Ok*(1-Ok)*(Ok - tk);
for(Connection c : connections){
double dw = -learningRate * dk * c.leftNeuron.getOutput();
c.setWeight(c.getWeight() + dw);
}
i++;
}
for(Neuron n : hiddenLayer){
ArrayList<Connection> connections = n.getAllInConnections();
double Oj = n.getOutput();
double sum = 0;
i = 0;
for(Neuron out_n : outputLayer){
double out_ok = out_n.getOutput();
double out_tk = expectedOutput[i];
double out_dk = out_ok*(1-out_ok)*(out_ok - out_tk);
double wjk = getWeightByNeurons(n, out_n);
sum += out_dk * wjk;
i++;
}
double dj = Oj*(1-Oj)*sum;
for(Connection c : connections){
double dw = -learningRate * dj * c.getFromNeuron().getOutput();
c.setWeight(c.getWeight() + dw);
}
}
}
使用的激活函数是sigmoid。