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 :)
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
@ 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
@ 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