Нейронная сеть Хопфилда не распознает - PullRequest
8 голосов
/ 13 февраля 2012

Я пытаюсь написать класс нейронной сети Хопфилда на 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];
        ...
    }
}

Спасибо за внимание.

1 Ответ

3 голосов
/ 16 апреля 2012

Основная ошибка заключалась в том, что я забыл установить нулевую переменную '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];
        ...
    }
}
...