我正在尝试使用具有1个隐藏层的神经网络来实现识别图像的程序。用户应该绘制一个数字,NN必须识别它。而且我遇到了一些麻烦
所以我得到一个2d数组,其中1是填充像素,反之亦然。我将2d变换为1d。 1d阵列的每个元素都变成输入神经元。 我有16个隐藏的神经元和10个输出神经元。
据我了解。我需要将输出神经元放在适当的位置,使Error函数为0。
我看起来像这样。其中lvl 1是输入层,lvl2 - 隐藏层,lvl3 - 输出层。最终,其中一个输出错误大约为0,但不是必需的。期望的数组在目标函数的位置上具有1。
我实施的逻辑有问题吗?
public void learn(int[] desired){
for(int i =0;i<Nl3;i++)
lvl3.get(i).SetDesired(desired[i]);
boolean b = false;
while(true && !b){
for(Neuro n : lvl3)
n.CountError();
CountL2Errors();
AdjustWeights();
int i = 0;
for(Neuro n : lvl3){
i++;
if(n.Error < 0.00005 && n.Error > -0.00005){
System.out.println(i+" "+n.Error);
b = true;
}
}
}
System.out.println("go");
}
对不起草率的写作,我非常困,而且这不是我的母语。
private void CountL2Errors(){
for(int i = 0;i<lvl2.size();i++){
float E = 0;
for(int j = 0;j<lvl3.size();j++){
E += lvl2.get(i).GetConnectionWeight(j)*lvl3.get(j).Error;
}
lvl2.get(i).SetW(E);
}
}
Lr = 0.2
private void AdjustWeights(){
for(int i = 0;i<lvl1.size();i++){
for(int j = 0;j<lvl2.size();j++){
float w = lvl1.get(i).GetConnectionWeight(j)*LR*lvl2.get(j).Error*lvl1.get(i).GetOutput();
lvl1.get(i).SetConnectionWeight(j, w);
}
}