backpropagation algo를 사용하여 신경망을 학습하려고합니다. OpenCV 2.3. 그러나 훈련 데이터 세트조차 제대로 예측할 수 없습니다. 아무도 여기서 내가 틀린 것을 찾도록 도와 줄 수 있니?신경망이 예측되지 않는 이유는 무엇입니까?
training_feature_matrix는 - 플로트 Nx69 행렬
training_age_matrix 값 - 플로트 NX4 행렬
test_feature_matrix 값 - 플로트 Mx69 행렬 값
test_age_matrix을 - 플로트 MX4 행렬
특징 값 (위에서 언급 한) 행렬은 다음과 같습니다 : [0.123435, 0.4542665, 0.587545, ... 68- 이러한 값 + 마지막 값 '1.0 또는 2.0'(남성/여성에 따라 다름)
연령 - 매트릭스 (위에서 언급 한)는 다음과 같습니다. [1, 0, 0, 0; 1, 0, 0, 0; 0, 1, 0, 0; ...] 여기 1s는 연령대 (아기, 어린이, 성인, 노인)의 특징 행렬이 속하는 행을 표시합니다. 여기
코드이다 : I 호출 파라미터로서 상기 매트릭스를 이용하여 '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.
감사합니다 :)
ann.get_weights (0) & ann.get_layer_sizes()는 포인터를 반환하므로 사용자가 원하는대로 인쇄하면 "쓰레기"처럼 보입니다. 나머지 코드는 괜찮은 것 같습니다. 데이터가 양호한가요? 정확하게 "예측이 정확하지 않다"는 것은 무슨 뜻입니까? – Bull
@ user2151446 어떻게 그 포인터에서 값을 추출합니까? 올바르게 예측하지 못했습니다 .... 출력 예측 행렬은 float 값의 행렬입니다. 양수, 음수 값 및 1보다 큰 값이 있습니다. 의미가 없습니다 ... OpenCV가 요구하는대로 float-matrix 형식의 입력 데이터가 완벽하게 ... ... – learner
@ user2151446 ann.get_weights()에서 값을 추출 할 수 있지만 ann.get_layer_sizes()를 추출하려면 베일이 아닙니다. 값. 어떻게해야합니까? – learner