2016-08-29 4 views
0

예제를 찾아 Cv_ANN_MLP를 배우려고합니다. 이것이 내가 생각해내는 것입니다. 멀티 레이어 퍼셉트론이 XOR 문제에 대한 해결책을 찾도록하고 싶었습니다. CvANN_MLP 유형의 "mlp"교육을 마친 후 "mlp.yaml"파일에 저장하려고합니다. 저장하고 있지만 사용하기 위해로드 할 때 작동하지 않습니다.Xv 프로그램에서 Cv_ANN_MLP :: load가 올바른 값을 제공하지 않음

맨 마지막에 "void mlp (__)"기능이 있습니다. 나는 "mlp.load"에 대해 의견을 말하고, 그것을 훈련시키고 그것을 저장했다. 나중에 "mlp.save"및 "mlp.train"에 주석을 달았지만 작동하지 않습니다.

감사합니다! (코드 :: 블록을 OpenCV 2.3.1을 사용하여)

전체 소스 코드

#include <iostream> 
#include <math.h> 
#include <string> 
#include <opencv2/opencv.hpp> 

using namespace std; 
using namespace cv; 

void mlp(cv::Mat& trainingData, cv::Mat& trainingClasses, cv::Mat& testData, cv::Mat& testClasses); 


float evaluate(cv::Mat& predicted, cv::Mat& actual) { 
    assert(predicted.rows == actual.rows); 
    int t = 0; 
    int f = 0; 
    for(int i = 0; i < actual.rows; i++) { 
     float p = predicted.at<float>(i,0); 
     float a = actual.at<float>(i,0); 
     if((p >= 0.5 && a >= 0.5) || (p <= 0.5 && a <= 0.5)) { 
      t++; 
     } else { 
      f++; 
     } 
    } 
    cout<<endl<<"("<<t<<"/"<<t+f<<")"<<endl; 
    return (t * 1.0)/(t + f); 
} 


using namespace cv; 

int main(int argc, char* argv) 
{ 
    Mat trainingData(4, 2, CV_32FC1); 
    Mat testData(4, 2, CV_32FC1); 

    cv::Mat trainResult(trainingData.rows, 1, CV_32FC1); 
    cv::Mat testResult(trainingData.rows, 1, CV_32FC1); 


    trainingData.at<float>(0, 0) = 0; 
    trainingData.at<float>(0, 1) = 0; 
    trainResult.at<float>(0, 0) = 0; 

    trainingData.at<float>(1, 0) = 0; 
    trainingData.at<float>(1, 1) = 1; 
    trainResult.at<float>(1, 0) = 1; 

    trainingData.at<float>(2, 0) = 1; 
    trainingData.at<float>(2, 1) = 0; 
    trainResult.at<float>(2, 0) = 1; 

    trainingData.at<float>(3, 0) = 1; 
    trainingData.at<float>(3, 1) = 1; 
    trainResult.at<float>(3, 0) = 0; 


    cout<<"Training Data\n "<<trainingData<<"\n\n"; 
    cout<<"Training Result\n "<<trainResult<<"\n\n"; 

    testData.at<float>(0, 0) = 0; 
    testData.at<float>(0, 1) = 0; 
    testResult.at<float>(0, 0) = 0; 

    testData.at<float>(1, 0) = 0; 
    testData.at<float>(1, 1) = 1; 
    testResult.at<float>(1, 0) = 1; 

    testData.at<float>(2, 0) = 1; 
    testData.at<float>(2, 1) = 0; 
    testResult.at<float>(2, 0) = 1; 

    testData.at<float>(3, 0) = 1; 
    testData.at<float>(3, 1) = 1; 
    testResult.at<float>(3, 0) = 0; 

    cout<<"Test Data\n "<<testData<<"\n\n"; 
    cout<<"Test Result\n "<<testResult<<"\n\n"; 

    mlp(trainingData, trainResult, testData, testResult); 

    return 0; 
} 

void mlp(cv::Mat& trainingData, cv::Mat& trainingClasses, cv::Mat& testData, cv::Mat& testClasses) { 

    CvANN_MLP mlp; 
    CvANN_MLP_TrainParams params; 
    CvTermCriteria criteria; 

    mlp.load("mlp.yaml"); 

    cv::Mat layers = cv::Mat(4, 1, CV_32SC1); 


    layers.row(0) = cv::Scalar(2); 
    layers.row(1) = cv::Scalar(2); 
    layers.row(2) = cv::Scalar(15); 
    layers.row(3) = cv::Scalar(1); 



    criteria.max_iter = 300; 
    criteria.epsilon = 0.00001f; 
    criteria.type = CV_TERMCRIT_ITER | CV_TERMCRIT_EPS; 
    params.train_method = CvANN_MLP_TrainParams::BACKPROP; 
    params.bp_dw_scale = 0.05f; 
    params.bp_moment_scale = 0.05f; 
    params.term_crit = criteria; 

    mlp.create(layers); 


    mlp.train(trainingData, trainingClasses, cv::Mat(), cv::Mat(), params); 

    cv::Mat response(1, 1, CV_32FC1); 
    cv::Mat predicted(testClasses.rows, 1, CV_32F); 
    for(int i = 0; i < testData.rows; i++) { 
     cv::Mat response(1, 1, CV_32FC1); 
     cv::Mat sample = testData.row(i); 

     mlp.predict(sample, response); 
     predicted.at<float>(i,0) = response.at<float>(0,0); 

     cout<<testData.at<float>(i, 0)<<", "<<testData.at<float>(i, 1)<<" = "<<response.at<float>(0, 0)<<endl; 
    } 

    cout << "Accuracy_{MLP} = " << evaluate(predicted, testClasses) << endl; 



    mlp.save("mlp.yaml"); 
} 
+0

[this] (http://stackoverflow.com/a/34547718/5008845)를 확인하십시오. – Miki

답변

0

좀 더 테스트 후, 나는 그것을 알아 냈다.

mlp.save()를 주석 처리하려면 mlp.create()에 대한 의견을 말해야합니다.

mlp.create()는 파일에서로드 된 후 mlp 객체의 레이어를 대체합니다.

관련 문제