这是我的代码,我按如下方式给出了输入,我删除了用户给出实际输出值的步骤,因为它是在代码中计算的,但仍然会发生同样的事情
“1”表示第一次输入 然后,第一个输入重量为“0.5” “0”然后是第二个输入 然后它的重量为“0.6” 然后,“0”表示所需的输出 然后定义值为“0.002” 学习率为“0.23”。
package Neural4copy;
import java.util.Scanner;
import java.lang.Math;
public class Demo {
// inputs are declared
private int x[][]=new int[1][2];
//weights are declared
private double w[][]=new double[1][2];
private double temp;
private double z[]=new double[1];
private double desiredOutput;
private double actualOutput;
private double error;
private double definedValue=0.004;
private double weightChange[][]=new double[1][2];
private double learningRate;
private double epilision=0.000000001;
private static double zTotal;
private Scanner user_input= new Scanner(System.in);
public void getData(){
for(int j=0;j<x.length;j++){
for(int i=0;i<x[0].length;i++){
System.out.println("Enter "+j+"th neuron "+i+"th input values :");
x[j][i]=user_input.nextInt();
System.out.println("Enter "+j+"th neuron "+i+" weight of the input value :");
w[j][i]=user_input.nextDouble();
}
}
System.out.println("Enter the desired Output :");
desiredOutput=user_input.nextDouble();
System.out.println("Enter the defined value for checking the condition");
definedValue=user_input.nextDouble();
System.out.println("Enter the learning rate");
learningRate=user_input.nextDouble();
calculate();
}
public void calculate(){
for(int j=0;j<x.length;j++){
for(int i=0; i<w[0].length; i++){
temp=0;
temp=x[j][i]*w[j][i];
z[j]+=temp;
}
zTotal+=z[j];
System.out.println("temp value :"+zTotal);
}
System.out.println("ztotal "+zTotal);
//double negZ= -zTotal;
double temp2=1+Math.exp(-zTotal);
actualOutput=1/temp2;
//actualOutput=1/(1+Math.exp(-zTot));
System.out.println("actualOutput "+actualOutput);
if(Math.abs(actualOutput-desiredOutput)>epilision){
calculateError();
}
else{
printWeights();
}
}
public void calculateError(){
System.out.println("desired out put :"+desiredOutput+" actual out put :"+actualOutput);
error=0.5*((desiredOutput-actualOutput)*(desiredOutput-actualOutput));
System.out.println("error "+error+"\n\n");
//error=0.003;
checkingCondition();
}
public void checkingCondition(){
if(error<definedValue){
printWeights();
}
else{
balanceWeights();
}
}
public void balanceWeights(){
//System.out.println("new Weights are");
for(int j=0;j<w.length;j++){
for(int i=0;i<w[0].length;i++){
weightChange[j][i]=(-learningRate)*(desiredOutput-actualOutput)*actualOutput*(1-actualOutput)*x[j][i];
System.out.println("weight change "+weightChange[j][i]);
w[j][i]+=weightChange[j][i];
//System.out.print(w[i]+"\t");
}
}
calculate();
}
public void printWeights(){
System.out.print("The balanced weights are: ");
for(int j=0;j<x.length;j++){
for(int i=0;i<x[0].length;i++){
System.out.println("Neuron "+j+"Weight of input"+i+"=\t"+w[j][i]);
}
}
}
}
但是这些代码不按规定运行,而不是先按zTotal
方法编码calculate()
打印出来。并且输出从zTotal
开始为335851.72992330056值,这是不可能的,并且error
不会更改它保持值为0.5并且发生finall“StackOverFlowError”。
为什么这个
这是我输出的顶部
weight change 0.0
zTotal :348355.7408125164
temp value :348986.9403243046
ztotal 348986.9403243046
actualOutput 1.0
desired out put :0.0 actual out put :1.0
error 0.5
weight change 0.0
weight change 0.0
zTotal :348986.9403243046
temp value :349618.7111663145
ztotal 349618.7111663145
actualOutput 1.0
desired out put :0.0 actual out put :1.0
error 0.5
weight change 0.0
weight change 0.0
zTotal :349618.7111663145
temp value :350251.053338546
ztotal 350251.053338546
actualOutput 1.0
desired out put :0.0 actual out put :1.0
error 0.5
weight change 0.0
weight change 0.0
zTotal :350251.053338546
temp value :350883.96684099914
ztotal 350883.96684099914
actualOutput 1.0
desired out put :0.0 actual out put :1.0
error 0.5
zTotal :348355.7408125164
为什么这是从高值开始
答案 0 :(得分:0)
我看到了你得到的这些价值观,但他们不在输出的开头,而是进一步下降。请参阅:http://ideone.com/06KyMj
在输出的顶部,我看到:
temp value :0.5
ztotal 0.5
actualOutput 0.6224593312018546
desired out put :0.0 actual out put :0.6224593312018546
error 0.19372780950013005
这可能与输出显示方式有关。有些环境只显示最后几千行,而顶部会被切断。
答案 1 :(得分:-1)
查看您的异常消息,您将看到堆栈(您调用调用方法的方法)...基本的stackoverflow异常。
计算&gt; calculateError&gt; checkingCondition&gt; balanceWeights&gt;的计算强>
堆栈的大小有限,所以你使用迭代实现,但我认为当神经元值为0或从不时,此代码不会收敛,我没有真正理解这个算法没有注释。