5

バックプロパゲーション アルゴリズムを使用してニューラル ネットワークをトレーニングしようとしています。OpenCV 2.3で。ただし、正しく予測していません....トレーニングデータセットでさえありません。ここで何が問題なのか、誰か助けてくれませんか?

training_feature_matrix - float 値の Nx69 マトリックス

training_age_matrix - float 値の Nx4 マトリックス

test_feature_matrix - float 値の Mx69 マトリックス

test_age_matrix - float 値の Mx4 マトリックス

機能マトリックス (上記) は次のようになります: [0.123435、0.4542665、0.587545、... 68-そのような値 + 男性/女性に応じて最後の値 '1.0 または 2.0')

年齢行列 (上記) は次のようになります: [1, 0, 0 ,0; 1、0、0、0; 0、1、0、0; ...] ここで 1 は、特徴行列の対応する行が属する年齢のクラス (赤ちゃん、子供、成人、老人) を示します。

ここにコードがあります:上記の行列をパラメーターとして使用して「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 を返しています。

ありがとう :)

4

2 に答える 2

2

その質問が尋ねられてから長い時間が経ちましたが、答えを共有します。シグモイドの出力値にも同様の問題がありました。現在は解決されています。ここで私の問題を確認できます:

OpenCV ニューラル ネットワーク シグモイド出力

エラーを要約すると、mlp の create 関数のデフォルト パラメータが原因で発生しています。次のように使用します: ann.create(layers, CvANN_MLP::SIGMOID_SYM, 1, 1)

于 2014-02-28T07:45:47.303 に答える
1

逆伝播は常に収束するとは限りません。爆発してナンセンスを生み出す可能性が非常に高いです。これは、イプシロンまたは運動量_スケールの値が大きすぎる場合に発生する可能性があります。あなたの勢いはうまくいく可能性のあるものの上限にあるように見えます。私はそれを減らしてみます.

于 2013-08-03T22:46:27.090 に答える