Отчет по лабораторной работе №5 дисциплина «Нейрокомпьютеры и сети». Тема: «Обучение распознаванию объектов с помощью сети Хемминга» Выполнил: студент гр.140901 Батищев Д.С. Проверил: Корсунов Н.И. Если в задаче ассоциативной памяти нет необходимости в том, чтобы нейросеть выдавала эталонный образец, а достаточно только номера образца, то для этих целей используется сеть Хемминга. Структурная схема сети Хемминга представлена на рисунке 2. Рисунок 2. Сеть Хемминга Данная сеть, в сравнении с сетью Хопфилда, характеризуется меньшими вычислительными затратами. В сети Хемминга два слоя – первый и второй слои состоят из нейронов и равно числу образцов. Нейроны первого слоя имеют по входных синапсов, где - размерность входных векторов. Нейроны второго слоя связаны между собой обратными, отрицательными связями. Обратная связь от аксона на владельца нейрона равен +1. Суть работы состоит в нахождении расстояния Хемминга от тестируемого образца до всех образцов. Расстоянием Хемминга называется число отличающихся битов в двух бинарных векторах. - расстояние Хемминга равно 0. - расстояние Хемминга равно 2. Сеть должна выбрать образец с минимальным расстоянием Хемминга до поданного входного сигнала – в результате активируется один выход, отвечающий за данный эталонный образец. При инициализации сети весовым коэффициентам первого слоя и порогу активационной функции присваиваются следующие значения: , i=0...n-1, k=0...m-1 Tk = n / 2, k = 0...m-1 k где xi – i-ый элемент k-ого образца. Весовые коэффициенты тормозящих синапсов во втором слое берут равными некоторой величине 0 < < 1/m. Синапс нейрона, связанный с его же аксоном имеет вес +1. Алгоритм работы сети Хэмминга следующий: 1. На входы сети подается неизвестный вектор X = {xi:i=0...n-1}, исходя из которого рассчитываются состояния нейронов первого слоя (верхний индекс в скобках указывает номер слоя): , j=0...m-1 После этого полученными значениями инициализируются значения аксонов второго слоя: yj(2) = yj(1), j = 0...m1 2. Вычислить новые состояния нейронов второго слоя: и значения их аксонов: Активационная функция f имеет вид порога, причем величина F должна быть достаточно большой, чтобы любые возможные значения аргумента не приводили к насыщению. 3. Проверить, изменились ли выходы нейронов второго слоя за последнюю итерацию. Если да – перейди к шагу 2. Иначе – завершение работы. Из оценки алгоритма видно, что роль первого слоя нейронов весьма условна: воспользовавшись один раз на шаге 1 значениями его весовых коэффициентов, сеть больше не обращается к нему, поэтому первый слой может быть вообще исключен из сети (просто заменен на матрицу весовых коэффициентов. void __fastcall TForm1::ListBox1Click(TObject *Sender) { Image1->Canvas->Pen->Color=clWhite; Image1->Canvas->Brush->Color=clWhite; Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height); if (ListBox1->Items->Count>0) { Image1->Canvas->Pen->Color=clBlack; Image1->Canvas->Brush->Color=clBlack; for (int i=0;i<9;i++) { if (x_matrix[ListBox1->ItemIndex][i]==1) { Image1->Canvas>Rectangle((i%3)*50,(i/3)*50,(i%3)*50+50,(i/3)*50+50); }; } } void __fastcall TForm1::TeatchWeb(int ** x_matrix,int count_x,int size_x, double ** w_matrix) { // } void __fastcall TForm1::MakeTest(int * x_matrix, double ** w_matrix,int count_x,int size_x,double * d_matrix) { double max_D=-1000; int count_max_D=0; for (int j=0;j<count_x;j++) { d_matrix[j]=4.5; //ShowMessage(AnsiString("dD(")+j+")="+d_matrix[j]); for (int i=0;i<size_x;i++) { d_matrix[j]+=x_matrix[i]*w_matrix[j][i]; //ShowMessage(AnsiString("dD(")+j+")="+d_matrix[j]+"____"+x_matrix[i]+ "*"+w_matrix[j][i]); } if (max_D == d_matrix[j]) { count_max_D++; } if (max_D < d_matrix[j]) { max_D = d_matrix[j]; count_max_D = 1; } } //ShowMessage(AnsiString("MaxD=")+max_D+"_count("+count_max_D+")"); if (count_max_D==1) { for (int j=0;j<count_x;j++) { d_matrix[j] = d_matrix[j]==max_D ? 1 : 0; } } else { for (int j=0;j<count_x;j++) { d_matrix[j] = 0; } } } Листинг кода, реализующего задание.