2013-05-17 35 views
5

Sto provando ad addestrare una rete neurale usando il backpropagation algo. in OpenCV 2.3. Tuttavia non si preannuncia correttamente ... nemmeno sul set di dati di addestramento. Qualcuno potrebbe aiutarmi a trovare cosa c'è di sbagliato qui?Perché la rete neurale non è in grado di prevedere?

training_feature_matrix - matrice Nx69 di galleggiante valori

training_age_matrix - matrice NX4 di galleggiante valori

test_feature_matrix - matrice Mx69 di galleggiante valori

test_age_matrix - matrice Mx4 di galleggiante valori

la caratteristica matrici (menzionate sopra) sono come: [0.123435, 0.4542665, 0.587545, ... 68-tali valori + ultimo valore '1.0 o 2.0' a seconda del suo maschio/femmina)

le matrici di età (sopra menzionate) sono come: [1, 0, 0, 0; 1, 0, 0, 0; 0, 1, 0, 0; ...] qui 1s mostra la classe di età (bambino, bambino, adulto, vecchio) a cui appartiene la riga corrispondente della matrice di caratteristiche.

ecco il codice: chiamo funzione 'MLP' utilizzando matrici sopra come parametri)

cv::Mat mlp(cv::Mat& training_feature_matrix, cv::Mat& training_age_matrix, cv::Mat& test_feature_matrix, cv::Mat& test_age_matrix) 
{ 
cv::Mat layers = cv::Mat(3, 1, CV_32SC1); 
layers.row(0) = cv::Scalar(69); 
layers.row(1) = cv::Scalar(36); 
layers.row(2) = cv::Scalar(4); // cout<<layers<<"\n"; 

CvANN_MLP ann; 
CvANN_MLP_TrainParams params; 
CvTermCriteria criteria; 
criteria.max_iter = 10000; 
criteria.epsilon = 0.001; 
criteria.type  = CV_TERMCRIT_ITER + CV_TERMCRIT_EPS; 
params.train_method = CvANN_MLP_TrainParams::BACKPROP; 
params.bp_dw_scale = 0.1; 
params.bp_moment_scale = 0.1; 
params.term_crit = criteria; 

ann.create(layers, CvANN_MLP::SIGMOID_SYM); 
ann.train(training_feature_matrix, training_age_matrix, cv::Mat(), cv::Mat(), params); 

cv::Mat predicted(test_age_matrix.rows, 4, CV_32SC1); 
for(int i = 0; i < test_feature_matrix.rows; i++) 
{ 
    cv::Mat response(1, 4, CV_32F); 
    cv::Mat sample = test_feature_matrix.row(i); 
    ann.predict(sample, response); 
    for (int g = 0; g < 4; g++) 
    { 
    predicted.at<int>(i,g) = response.at<float>(0,g); 
    } 
} 
    cout << "\n"; 
    cout << ann.get_weights(0) << "\n"; 
    cout << ann.get_layer_sizes() << "\n"; 
    cout << ann.get_layer_count() << "\n\n"; 

return predicted; 
} 

EDIT Inoltre, le ann.get_weights (0) & ann.get_layer_sizes() tornano valori immondizia ma ann.get_layer_count() sta tornando valore corretto 3.

Grazie :)

+1

ann.get_weights (0) & ann.get_layer_sizes() restituiscono puntatori, quindi sembreranno "spazzatura" se li stampi come hai fatto tu. Il resto del tuo codice sembra essere ok, sei sicuro che i tuoi dati siano buoni? Che cosa significa esattamente "non si predice correttamente"? – Bull

+0

@ user2151446 come estrarre i valori da quei puntatori? non prevedere correttamente significa .... la matrice di previsione di output che sto ottenendo è una matrice di valori float ... ci sono valori positivi, negativi e anche valori maggiori di 1 .... non ha senso ... i dati di input sono perfettamente a posto ... ognuno sotto forma di matrice mobile come richiede OpenCV ... – learner

+0

@ user2151446 Sono in grado di estrarre valori da ann.get_weights() ma non balla per estrarre ann.get_layer_sizes() valore. Cosa dovrei fare? – learner

risposta

1

Indietro propagazione non sempre convergono. È molto probabile che esploda e produca sciocchezze. Questo è probabile se i valori epsilon o momentum_scale sono troppo grandi. Il tuo slancio sembra essere nella parte più alta di ciò che potrebbe funzionare e proverei a ridurlo.

2

È passato molto tempo da quella domanda ma condividerò la risposta. Ho avuto un problema simile con i valori di uscita di sigmoid. È risolto ora. È possibile controllare il mio problema qui:

OpenCV Neural Network Sigmoid Output

In sintesi l'errore, che è in corso a causa delle parametri predefiniti della funzione di creare MLP. Utilizzare in questo modo: ann.create (livelli, CvANN_MLP :: SIGMOID_SYM, 1, 1).

+0

grazie per il tuo contributo! Lo apprezzo! Proverò presto ... – learner

Problemi correlati