Я пытаюсь написать класс нейронной сети Хопфилда на Java, но сеть не хочет распознавать шаблоны.
И я не могу понять, где ошибка.
Сеть представляет собой матрицу взаимосвязей 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];
...
}
}
Спасибо за внимание.