Нужно реализовать нейронную сеть Хопфилда на с++. Алгоритм в наипростейшем виде я реализовала. Теперь вопрос стоит в том как сделать так, чтобы образцы считывались с картинок или txt-файлов. Если кто-то будет готов помочь с этим, буду очень благодарна. Код, который имею на данный момент, прилагаю. Код | #include <stdio.h> #include <omp.h> #include <iostream> int main() { int n = 3; int m = 4;//количесво нейронов int **mas = new int* [n];//образцы для обучения for (int count = 0; count < m; count++) mas[count] = new int [m]; int *y = new int[m]; mas[0][0] = -1; mas[0][ 1] = 1; mas[0][ 2] = -1; mas[0][ 3] = 1; mas[1][ 0] = 1; mas[1][ 1] = -1; mas[1][ 2] = 1; mas[1][ 3] = 1; mas[2][ 0] = -1; mas[2][1] = 1; mas[2][2] = -1; mas[2][ 3] = -1; int i = 0, j = 0; std::string s = ""; int **w = new int* [m];// for (int count = 0; count < m; count++) w[count] = new int [m]; int **tm = new int*[m];//Временный массив for (int count = 0; count < m; count++) tm[count] = new int [m]; int k = 0; //нахожу W for (k = 0; k < n; k++) { for (i = 0; i < m; i++) for (j = 0; j < m; j++) tm[i][j] = mas[k][i] * mas[k][j]; //нахожу сумму tm[i] for (i = 0; i < m; i++) for (j = 0; j < m; j++) w[i][j] += tm[i][j]; } //Обнуляю главную диагональ w for (i = 0; i < m; i++) w[i][i] = 0; int *a = new int[m];//ф-ия активации bool b = false; k = 0;//Счётчик int l = -1;//Индекс подходящей строки while (!b && k < 200) { //Вычисляю y' for (i = 0; i < m; i++) for (j = 0; j < m; j++) a[i] += w[i][j] * y[j]; //Обрабатываю y' ф-ей активации for (i = 0; i < m; i++) if (a[i] >= 0) a[i] = 1; else a[i] = -1; //Сравниваю bool st = false; for (i = 0; i < n; i++) { st = true; for (j = 0; j < m; j++) if (mas[i][ j] != a[j]) { st = false; break; } if (st) { l = i; break; } } if (l != -1) b = true; else { k++;//Увеличиваю счетчик //Обновляем у' for (i = 0; i < m; i++) y[i] = a[i]; //Обнуляем a for (i = 0; i < m; i++) a[i] = 0; } } if (l != -1) { printf("clones with X = %i", (l + 1)); } else { printf("no clones"); } system("PAUSE"); }
|
|