5

Ich versuche ein neuronales Netzwerk mit Backpropagation Algo zu trainieren. in OpenCV 2.3. Allerdings ist es nicht richtig vorhersagen .... nicht einmal auf Trainingsdatensatz. Könnte mir bitte jemand helfen, hier zu finden, was falsch ist?Warum sagt das neuronale Netzwerk nicht voraus?

training_feature_matrix - NX69 Matrix von Fließkommawerten

training_age_matrix - Nx4 Matrix von Fließkommawerten

test_feature_matrix - MX69 Matrix von Fließkommawerten

test_age_matrix - Mx4 Matrix von Fließkommawerten

das Merkmal Matrizen (oben erwähnt) sind wie folgt: [0.123435, 0.4542665, 0.587545, ... 68-solcher Werte + letzter Wert '1.0 oder 2.0', je nach männlich/weiblich)

die Altersmatrizen (oben erwähnt) sind wie folgt: [1, 0, 0, 0; 1, 0, 0, 0; 0, 1, 0, 0; ...] hier zeigt 1s die Altersklasse (Baby, Kind, Erwachsener, alt) die entsprechende Zeile der Feature Matrix gehört dazu.

hier ist der Code: I 'mlp' Funktion über Matrizen als Parameter)

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 rufen, Auch die ann.get_weights (0) & ann.get_layer_sizes() zurückkehren Müll Werte aber ann.get_layer_count() wird korrekten Wert zurückkehrt 3.

Thanks :)

+1

ann.get_weights (0) & ann.get_layer_sizes() geben Zeiger zurück, so wird es wie "Müll" aussehen, wenn Sie sie wie Sie drucken. Der Rest Ihres Codes scheint in Ordnung zu sein. Sind Sie sicher, dass Ihre Daten gut sind? Was genau bedeutet "nicht richtig vorhersagen"? – Bull

+0

@ user2151446 Wie extrahiere ich Werte aus diesen Zeigern? nicht richtig vorhersagen bedeutet .... die Ausgabe Vorhersage Matrix, die ich bekomme, ist eine Matrix von Float-Werten ... es gibt positive, negative Werte und auch Werte größer als 1 .... es macht keinen Sinn ... die Eingabedaten sind völlig in Ordnung ... jede in der Form von Float-Matrix wie OpenCV verlangt ... – learner

+0

@ user2151446 Ich bin in der Lage, Werte aus ann.get_weights(), aber nicht Ballen zu extrahieren, um ann.get_layer_sizes() zu extrahieren Wert. Was soll ich machen? – learner

Antwort

1

Backpropagation nicht immer konvergieren. Es ist ziemlich wahrscheinlich, dass es explodiert und Unsinn produziert. Dies ist wahrscheinlich, wenn die Werte für epsilon oder momentum_scale zu groß sind. Ihr Momentum scheint am oberen Ende dessen zu sein, was funktionieren könnte, und ich würde versuchen, es zu reduzieren.

2

Es ist lange seit dieser Frage gefragt, aber ich werde die Antwort teilen. Ich hatte ein ähnliches Problem mit den Ausgabewerten des Sigmoids. Es ist jetzt gelöst. Sie können mein Problem hier überprüfen:

OpenCV Neural Network Sigmoid Output

den Fehler fassen, wird auftreten, weil der Standardparameter von der mlp Funktion erstellen. Verwenden Sie so: ann.create (Schichten, CvANN_MLP :: SIGMOID_SYM, 1, 1).

+0

danke für Ihre Eingabe! Ich schätze es! Werde es bald ausprobieren ... – learner