我正在尝试用Java编写Hopfield神经网络类,但网络不想识别模式。 我无法理解错误在哪里。 网络用互连矩阵w [n] [n]表示。 当用一些标准模式教授网络时,我用以下方法改变互连矩阵:
private void teaching(int[] pattern){ //teaching
for(int i=0; i<n; i++)
for(int j=0; j<n; j++){
if(i==j) w[i][j]=0;
else w[i][j] += pattern[i]*pattern[j];
}
}
然后我尝试以某种类似的模式识别标准模式。当神经元状态停止变化或克服阈值(65535次迭代)时,应停止该过程:
private int[] recognition(int[] pattern){
int net=0, s, j=0;
int[] previousState = new int[n];
do{
System.arraycopy(pattern, 0, previousState, 0, n);
int r = generateRandom(n);
for(int i=0; i<n; i++)
net+=pattern[i]*w[i][r];
s = signum(net);
pattern[r] = s;
j++;
if(j>iterThreshold){
System.err.println("Threshold overcome.");
return pattern;
}
}while(!Arrays.equals(pattern, previousState));
return pattern;
}
signum是一个激活函数:
private static int signum(int x){ //activation function
if(x>0) return 1;
else return -1;
}
识别过程仅在超过阈值时停止。而且模式看起来不像标准模式。请帮忙找出错误。 提前谢谢。
P.S。问题已经解决了。 主要的错误是我忘了在循环开始时设置为零'net'变量:
private int[] recognition(int[] pattern){
int net=0, s, j=0;
...
do{
net=0;
for(int i=0; i<n; i++)
net+=pattern[i]*w[i][r];
...
}
}
感谢您的关注。
答案 0 :(得分:3)
主要的错误是我忘了在循环开始时设置为零'net'变量:
private int[] recognition(int[] pattern){
int net=0, s, j=0;
...
do{
net=0;
for(int i=0; i<n; i++)
net+=pattern[i]*w[i][r];
...
}
}