2013-05-17 20 views
5

私はバックプロパゲーションアルゴを使ってニューラルネットワークをトレーニングしようとしています。 OpenCV 2.3で。 しかし、訓練データセットでさえ、正しく予測されていません。誰も私がここで何が間違っているのを見つけるのを助けてくれますか?なぜニューラルネットワークは予測しないのですか?

training_feature_matrix - フロートのNx69マトリックスが

training_age_matrix値 - フロートのNX4マトリックスは

test_feature_matrix値 - フロートのMX4マトリックス

に特徴値 - フロートのMx69マトリックスは

test_age_matrixが値(上述の)マトリックスは、[0.123435,0.445665,0.587545、... 68-そのような値+最後の値 '1.0または2.0'(男性/女性に依存)]

年齢 - マトリックス(上記)は、以下のようになります。[1,0,0,0; 1、0,0,0; 0,1,0,0; ...]ここで1sは、年齢のクラス(赤ちゃん、子供、大人、古い)の特徴行列の対応する行が属していることを示しています。ここで

コードである:私が呼び出しパラメータとして上記マトリクスを使用して 'MLP' 機能)また

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、ann.get_weights(0)& ann.get_layer_sizes()ガベージ値を返すしていますしかしann.get_layer_count()が正しい値3.

感謝:)

+1

ann.get_weights(0)&ann.get_layer_sizes()はポインタを返すので、あなたが持っているかのようにそれらを印刷すると "ゴミ"のように見えます。あなたのコードの残りは大丈夫と思われます、あなたのデータは良いですか?正確に「正確に予測していない」とはどういう意味ですか? – Bull

+0

@ user2151446どうすればこれらのポインタから値を抽出できますか? が正しく予測されないことを意味します。私が得ている出力予測行列は、浮動小数点数の行列です。正、負の値も1より大きい値もあります。 OpenCVのように浮動行列の形式で入力データが完全に正常です... – learner

+0

@ user2151446 ann.get_weights()では値を抽出できますが、ann.get_layer_sizes()を抽出するにはベールではありません。値。私は何をすべきか? – learner

答えて

1

戻る伝播を返して、常に収束しません。爆破してナンセンスを生む可能性が非常に高い。これは、εまたはmomentum_scaleの値が大きすぎる場合に発生する可能性があります。あなたの勢いは、何がうまくいくかの上端にあるように見え、私はそれを減らそうとします。

2

この質問は長い間続いていますが、私は答えを共有します。 Sigmoidの出力値にも同様の問題がありました。今解決されました。あなたはここに私の問題を確認することができます。

OpenCV Neural Network Sigmoid Output

がエラーを要約すると、それが原因でMLPの作成機能のデフォルトパラメータで発生しています。このように使用します:ann.create(layers、CvANN_MLP :: SIGMOID_SYM、1,1)

+0

あなたの入力に感謝!それは有り難いです!すぐに試してみる... – learner

関連する問題