Обучение распознаванию объектов с помощью сети Хемминга

advertisement
Отчет по лабораторной работе №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;
}
}
}
Листинг кода, реализующего задание.
Download