Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Нейронные сети


Автор: Friackazoid 20.5.2007, 20:50
Пишу программу распознования букв алфивита. Общая концепция такая: есть 32 bmp файла (100х100) названных а.bmp б.bmp и т.д. с образцами букв. Нейронная сеть считывает эти файлы и обучается. Пользователь создает файл test.bmp (100x100) со своей буквой и прога должна его распознать.

Реализую я все это дело через классический персептон. То есть внешний сенсорный слой это вектор картинки (1-черный пиксель 0-белый), скрытый слой из 100 нейронов, и выходной слой из 5 нейронов. Буквы кодируются на выходном слое так а=00001 б=00010 и т.д.

Проблема в том что очень много литературы и везде все написано по разному. Вот и не очень понимаю в алгоритме обучения сети какую форммулу использовать для рассчета дельта.

Вот то что есть
Код

#define FIRST_LAYER 10000
#define SECOND_LAYER 100
#define THERD_LAYER 5

class NeuronNet
{
public:
    double S1[FIRST_LAYER]; //массив состояний (выходов) нейронов 1-го слоя
    double S2[SECOND_LAYER]; //массив состояний (выходов) нейронов 2-го слоя,
    double S3[THERD_LAYER]; //массив состояний (выходов) нейронов 3-го слоя,

    double W1 [FIRST_LAYER][SECOND_LAYER]; //массив весов синапсических связей от 1ого слоя ко 2ому
    double W2 [SECOND_LAYER][THERD_LAYER]; //массив весов синапсических связей от 2ого слоя к 3eму

    double G3 [THERD_LAYER]; //массив тебуемых значений при обучении

    void readfile (int);
    void LernNeuronNet (void);

    NeuronNet(void);
    ~NeuronNet(void);
};

void NeuronNet::LernNeuronNet (void)
{
    double sum=0;
    for (int i =0; i<32; i++) //сеть будет распозновать 32 символа русского алфавита
    {
        readfile(i);
        for (int j=0; j<200; j++) //упростим алгоритм и сделаем количество итераций для обучения постоянным
        {
            for (int k=0; k<SECOND_LAYER; k++)
            {
                S2[k]=0;
                for (int l=0; l<FIRST_LAYER; l++)
                    sum += S1[l]*W1[l][k];

                S2[k] = 1/1+exp(sum); 
            }

            for (int k=0; k<THERD_LAYER; k++)
            {
                S3[k] =0;
                for (int l=0; l<SECOND_LAYER; l++)
                    sum += S2[l]*W2[l][k];
                                    //корректо но ли??
                                     if (sum > 0.5) S3[k]=1;
                else S3[k]=0;
            }

            for (int k=0; k<THERD_LAYER; k++)
                for (int l=0; l<SECOND_LAYER; l++)
                    W2[l][k] += S2[l](1-S2[l])(G3-S2[l]);

            for (int k=0; k<SECOND_LAYER; k++)
                for (int l=0; l<FIRST_LAYER; l++)
                {
                    Помогите рассчитать ошибку //W1[l][k] += 

                }
        }
    }
}


Подскажите пожалуста формулу для рассчета дельты для массива весов от входного слоя к скрытому. а также с удовольствием выслушаю советы и замечания.

Автор: Greeen 21.5.2007, 08:53
 smile 
В http://forum.vingrad.ru/forum/tech-algorithm-techique-method.html

Автор: Friackazoid 21.5.2007, 10:22
Кто-нибудь из модераторов, перенесите тему тогда.

Автор: Promitheus 21.5.2007, 12:02
W(i+1)=W(i)-Коб*Delta(i)*Х;
Коб - коэффициент обучения 0<Коб<1;
delta=abs( эталонный выход - реальный выход).//соотв компонента вектора

Обучение делается до тех пор, пока delata<Eps. Eps-ошибка обучения.

Вообще на мой взгляд здесь целесообразнее использовать структуры, а не классы, иначе упрётся алгоритм в низкую производительность.

Автор: Friackazoid 21.5.2007, 13:02
Promitheus, 

Это-то понятно. Теории везде полно. Непонятно как это написать в коде. Что такое Delta(i) и что такое Х. smile 

Автор: Promitheus 21.5.2007, 13:38
Что-то мне сдаётся ты не совсем понимаешь суть вопроса. X - входной компонент кетора delta(i) - значение дельты на i шаге итерации. delta=abs( эталонный выход - реальный выход).
Я написал как сам сделал.  

Автор: Promitheus 22.5.2007, 08:20
По-моему, у тебя не правильно структура организована нейро сетки. Там каждый элемент текущего слоя должен быть связан, с каждым элементом последующего слоя, за исключением когда веса редуцированы (W=0).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)