8
我想用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;
}
正负号是激活函数:仅当阈值被传递
private static int signum(int x){ //activation function
if(x>0) return 1;
else return -1;
}
识别过程停止。出模式看起来不像标准模式。请帮助找到错误。 预先感谢您。
P.S.问题已经解决了。 主要错误是,我忘了设置为零“网”变量周期的开始:
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];
...
}
}
感谢您的关注。
我想的Java已经有了'Math.signum(X)'为double和float输入法X?如果x = 0,您的版本将忽略零(0)。请参阅链接http://en.wikipedia.org/wiki/Signum_function – 2012-02-13 01:46:17
我的版本不会忽略x = 0。当x = 0时,signum(x)= - 1。模式向量只能由“1”或“-1”值组成。 – user1020946 2012-02-13 14:15:52
你有没有机会参加Hinton的神经网络课程? – Nayuki 2012-02-28 01:42:08