2013-12-23 5 views
1

Я использую функцию FANN для приближения функции. Мой код здесь:FANN не тренируется

/* 
* File: main.cpp 
* Author: johannsebastian 
* 
* Created on November 26, 2013, 8:50 PM 
*/ 

#include "../FANN-2.2.0-Source/src/include/doublefann.h" 
#include "../FANN-2.2.0-Source/src/include/fann_cpp.h" 
//#include <doublefann> 
//#include <fann/fann_cpp> 
#include <cstdlib> 
#include <iostream> 


using namespace std; 
using namespace FANN; 

//Remember: fann_type is double! 

int main(int argc, char** argv) { 
    //create a test network: [1,2,1] MLP 
    neural_net * net = new neural_net; 
    const unsigned int layers[3] = {1, 2, 1}; 
    net->create_standard_array(3, layers); 

    //net->create_standard(num_layers, num_input, num_hidden, num_output); 

    //net->set_learning_rate(0.7f); 

    //net->set_activation_steepness_hidden(0.7); 
    //net->set_activation_steepness_output(0.7); 

    net->set_activation_function_hidden(SIGMOID); 
    net->set_activation_function_output(SIGMOID); 
    net->set_training_algorithm(TRAIN_RPROP); 

    //cout<<net->get_train_error_function() 
    //exit(0); 
    //test the number 2 
    fann_type * testinput = new fann_type; 
    *testinput = 2; 
    fann_type * testoutput = new fann_type; 
    *testoutput = *(net->run(testinput)); 
    double outputasdouble = (double) *testoutput; 
    cout << "Test output: " << outputasdouble << endl; 

    //make a training set of x->x^2 
    training_data * squaredata = new training_data; 
    squaredata->read_train_from_file("trainingdata.txt"); 
    //cout<<testinput[0]<<endl; 
    //cout<<testoutput[0]<<endl; 
    cout<<*(squaredata->get_input())[9]<<endl; 
    cout<<*(squaredata->get_output())[9]<<endl; 
    cout<<squaredata->length_train_data(); 

    //scale data 
    fann_type * scaledinput = new fann_type[squaredata->length_train_data()]; 
    fann_type * scaledoutput = new fann_type[squaredata->length_train_data()]; 
    for (unsigned int i = 0; i < squaredata->length_train_data(); i++) { 
      scaledinput[i] = *squaredata->get_input()[i]/200;///100; 
      scaledoutput[i] = *squaredata->get_output()[i]/200;///100; 
      cout<<"In:\t"<<scaledinput[i]<<"\t Out:\t"<<scaledoutput[i]<<endl; 
    } 

    net->train_on_data(*squaredata, 1000000, 100000, 0.001); 

    *testoutput = *(net->run(testinput)); 
    outputasdouble = (double) *testoutput; 
    cout << "Test output: " << outputasdouble << endl; 

    cout << endl << "Easy!"; 
    return 0; 
} 

Вот trainingdata.txt:

10 1 1 
1 1 
2 4 
3 9 
4 16 
5 25 
6 36 
7 49 
8 64 
9 81 
10 100 

Когда я бегу я получаю это:

Test output: 0.491454 
10 
100 
10In: 0.005 Out: 0.005 
In:  0.01  Out: 0.02 
In:  0.015 Out: 0.045 
In:  0.02  Out: 0.08 
In:  0.025 Out: 0.125 
In:  0.03  Out: 0.18 
In:  0.035 Out: 0.245 
In:  0.04  Out: 0.32 
In:  0.045 Out: 0.405 
In:  0.05  Out: 0.5 
Max epochs 1000000. Desired error: 0.0010000000. 
Epochs   1. Current error: 2493.7961425781. Bit fail 10. 
Epochs  100000. Current error: 2457.3000488281. Bit fail 9. 
Epochs  200000. Current error: 2457.3000488281. Bit fail 9. 
Epochs  300000. Current error: 2457.3000488281. Bit fail 9. 
Epochs  400000. Current error: 2457.3000488281. Bit fail 9. 
Epochs  500000. Current error: 2457.3000488281. Bit fail 9. 
Epochs  600000. Current error: 2457.3000488281. Bit fail 9. 
Epochs  700000. Current error: 2457.3000488281. Bit fail 9. 
Epochs  800000. Current error: 2457.3000488281. Bit fail 9. 
Epochs  900000. Current error: 2457.3000488281. Bit fail 9. 
Epochs  1000000. Current error: 2457.3000488281. Bit fail 9. 
Test output: 1 

Easy! 
RUN FINISHED; exit value 0; real time: 9s; user: 10ms; system: 4s 

Почему обучение не работает? После того, как я попросил similar question, мне сказали увеличить вход и выход NN. Я сделал это. Я получаю некоторые параметры (ы) неправильно, или мне просто нужно тренироваться дольше?

ответ

1

Номер узла в вашем скрытом слое слишком мал, чтобы соответствовать квадратичной функции. Я бы попробовал 10. Кроме того, я хотел бы рекомендовать вам fun applet, в котором вы можете имитировать процесс обучения с помощью установки параметров. Я попробовал с 10 узлами скрытого слоя и униполярным сигмоидом как функцию активации скрытого уровня и выходного уровня, фитинг неплох (но рандомизация весов может привести к сбою схождения, поэтому рекомендуется использовать больше узлов в скрытом слое, вы можете пытаются играть этот апплет себя и наблюдать некоторые интересные моменты):

enter image description here

+0

Это немного смешно. Когда я тестировал приложение Windows, 1-2-1 работал очень хорошо. Я просто изменил код на использование 1-10-1. Это все еще не работает. Практически такие же результаты. –

0

Может быть, немного поздно, но, возможно, новый новичок FANN будет видеть этот ответ, я надеюсь, что это помогает!

Я думаю, ваша проблема исходит от формата данных в вашем trainingdata.txt:

См: FANN data format

Вы должны сделать перевод строки после каждого входа и каждого выхода.

В вашем случае у вас есть 10 примеров с 1 входным и 1 выходным. Затем, вы должны форматировать ваш файл следующим образом:

10 1 1 
1 
1 
2 
4 
3 
9 
4 
16 
5 
25 
6 
36 
... 

Примечание: Я заметил, когда формат данных неправильно, ошибка вычисляется методом обучения является очень (очень) высокая. Может быть намек на просмотр формата файла, когда вы видите огромное значение ошибки.

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