2016-01-15 3 views
2

Я сделал простой персептрон в C++ для изучения ИИ и даже после book (pt_br), я не мог заставить свой персептрон получить ожидаемый результат, я попытался отлаживать и находить ошибку, но я did not success ,Персептрон сходится, но возвращает нечетные результаты

Моего алгоритма и результаты затвора (А и В = Y):

0 && 0 = 0 
0 && 1 = 1 
1 && 0 = 1 
1 && 1 = 1 

В основном его работа в качестве логического элемента ИЛИ или случайным образом.

Я пробовал прыгать на Peter Norving and Russel book, но он быстро проходит по этому вопросу и не объясняет глубину обучения персептрона.

Я действительно хочу узнать каждый дюйм этого содержимого, поэтому я не хочу переходить на многослойный персептрон, не делая простой работы, вы можете помочь?

Следующий код является минимальным кодом для работы с некоторыми пояснениями:

Sharp функция:

int signal(float &sin){ 
    if(sin < 0) 
     return 0; 
    if(sin > 1) 
     return 1; 

    return round(sin); 

} 

Perceptron Struct (W являются Весами):

struct perceptron{ 
    float w[3]; 
}; 

Perceptron обучение:

perceptron startTraining(){ 
    //- Random factory generator 
    long int t = static_cast<long int>(time(NULL)); 
    std::mt19937 gen; 
    gen.seed(std::random_device()() + t); 
    std::uniform_real_distribution<float> dist(0.0, 1.0); 
    //-- 

    //-- Samples (-1 | x | y) 
    float t0[][3] = {{-1,0,0}, 
        {-1,0,1}, 
        {-1,1,0}, 
        {-1,1,1}}; 

    //-- Expected result 
    short d [] = {0,0,0,1}; 

    perceptron per; 

    per.w[0] = dist(gen); 
    per.w[1] = dist(gen); 
    per.w[2] = dist(gen); 

    //-- print random numbers 
    cout <<"INIT "<< "W0: " << per.w[0] <<" W1: " << per.w[1] << " W2: " << per.w[2] << endl; 

    const float n = 0.1; // Lerning rate N 
    int saida =0;  // Output Y 
    long int epo = 0; // Simple Couter 
    bool erro = true; // Loop control 

    while(erro){ 
     erro = false; 
     for (int amost = 0; amost < 4; ++amost) {   // Repeat for the number of samples x0=-1, x1,x2 
      float u=0;          // Variable for the somatory 
      for (int entrad = 0; entrad < 3; ++entrad) { // repeat for every sinaptic weight W0=θ , W1, W2 
       u = u + (per.w[entrad] * t0[amost][entrad]);// U <- Weights * Inputs 
      } 
      // u=u-per.w[0];        // some references sau to take θ and subtract from U, i tried but without success 
      saida = signal(u);        // returns 1 or 0 
      cout << d[amost] << " <- esperado | encontrado -> "<< saida<< endl; 
      if(saida != d[amost]){       // if the output is not equal to the expected value 
       for (int ajust = 0; ajust < 3; ++ajust) { 
        per.w[ajust] = per.w[ajust] + n * (d[amost] - saida) * t0[amost][ajust]; // W <- W + ɳ * ((d - y) x) where 
        erro = true;                // W: Weights, ɳ: Learning rate 
       }                   // d: Desired outputs, y: outputs 
      }                    // x: samples 
      epo++; 

     } 
    } 
    cout << "Epocas(Loops): " << epo << endl; 
    return per; 
} 

Main с испытательной части:

int main() 
{ 
    perceptron per = startTraining(); 
    cout << "fim" << endl; 
    cout << "W0: " << per.w[0] <<" W1: " << per.w[1] << " W2: " << per.w[2] << endl; 
    while(true){ 
     int x,y; 
     cin >> x >> y; 

     float u=0; 
     u = (per.w[1] * x); 
     u = u + (per.w[2] * y); 
     //u=u-per.w[0]; 

     cout << signal(u) << endl; 


} 
    return 0; 
} 
+0

Если вам нужно что-то просто спросить, им действительно приятно улучшить вопрос – Ollegn

+1

У вас есть две пронумерованные строки '//u=u-per.w [0];'. Я бы сказал, что вы должны снова включить эту строку в своей основной (но НЕ в своем обучении) и посмотреть, что произойдет. – ThorngardSO

+0

@ThorngardSO, хорошо, я попробую – Ollegn

ответ

1

В вашей main(), повторно включить линию вы закомментирована. Кроме того, вы могли бы написать это, чтобы сделать его более освещения:

float u = 0.0f; 

u += (per.w[0] * float (-1)); 
u += (per.w[1] * float (x)); 
u += (per.w[2] * float (y)); 

Дело в том, что вы тренировали персептрон с тремя входами, первый из которых зашитым к «-1» (что делает первый вес w[0] действуют как постоянная «предвзятость»). Соответственно, в вашей тренировочной функции ваш u является суммой всех трех этих весовых продуктов. Однако в основном(), который вы опубликовали, вы полностью опускаете w [0], что приводит к неправильному результату.

+0

Я просто обработал большой файл, и он отлично работал, спасибо! – Ollegn

Смежные вопросы