2013-11-28 2 views
0

FANN으로 사각형 함수를 근사값으로 계산하려고합니다. 코드는 다음과 같습니다FANN이 제대로 훈련되지 않습니다.

#include "../FANN-2.2.0-Source/src/include/doublefann.h" 
#include "../FANN-2.2.0-Source/src/include/fann_cpp.h" 
#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,3,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_SYMMETRIC_STEPWISE); 
    net->set_activation_function_output(SIGMOID_SYMMETRIC_STEPWISE); 
    net->set_training_algorithm(TRAIN_QUICKPROP); 

    //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"); 

    net->train_on_data(*squaredata,1000,100,0.001); 

    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 

내가 바로 API와 함께 모든 것을 다했다고 생각합니다. 그러나, 내가 그것을 실행할 때, 나는 결코 훈련과 함께 줄이는 것처럼 보이는 거대한 오류를 얻는다.

Test output: -0.0311087 
Max epochs  1000. Desired error: 0.0010000000. 
Epochs   1. Current error: 633.9928588867. Bit fail 10. 
Epochs   100. Current error: 614.3250122070. Bit fail 9. 
Epochs   200. Current error: 614.3250122070. Bit fail 9. 
Epochs   300. Current error: 614.3250122070. Bit fail 9. 
Epochs   400. Current error: 614.3250122070. Bit fail 9. 
Epochs   500. Current error: 614.3250122070. Bit fail 9. 
Epochs   600. Current error: 614.3250122070. Bit fail 9. 
Epochs   700. Current error: 614.3250122070. Bit fail 9. 
Epochs   800. Current error: 614.3250122070. Bit fail 9. 
Epochs   900. Current error: 614.3250122070. Bit fail 9. 
Epochs   1000. Current error: 614.3250122070. Bit fail 9. 

Easy! 

내가 잘못 했습니까?

답변

3

출력 레이어에 시그 모이 드 기능을 사용하면 출력은 (0,1)의 범위를 제공합니다.

(1) 모든 출력을 상수 (예 : 1e4)로 나눌 수 있습니다. 테스트 데이터가 오면 1e4로 나눕니다. 문제는 100보다 큰 제곱 수 (100^2 = 1e4)를 예측하지 못할 수 있으며 (2) 숨겨진 출력 레이어와 선형 출력 레이어를 모두 만들면 네트워크에서 자동으로 가중치를 학습하여 사용자가 보유한 출력 값 .

+0

그러나 크기를 조정하면 데이터가 변경되지 않으므로 근사값이 손상됩니다. –

+0

두 가지 선택이 가능합니다. (1) 모든 출력을 상수 (예 : 1e4)로 나눕니다. 테스트 데이터가 오면 1e4로 나눕니다. 문제는 100보다 큰 제곱 수 (100^2 = 1e4)를 예측하지 못할 수 있으며 (2) 숨겨진 출력 레이어와 선형 출력 레이어를 모두 만들면 네트워크에서 자동으로 가중치를 학습하여 사용자가 보유한 출력 값 . – lennon310

+0

"숨겨진 레이어와 출력 레이어를 모두 선형으로 만듭니다"라고 말하면 정품 인증 기능을 의미합니까? –