2017-04-13 10 views
6

C# (Windows Form)에서 EmguCV 3.1 (OpenCV 라이브러리의 닷 NET 래퍼)을 사용하여 MLP (Multi-Layer Perceptron) 신경 네트워크를 구현하려고합니다. 이 라이브러리로 연습하기 위해 MLP를 사용하여 OR 작업을 구현하기로 결정했습니다.EmguCV의 다중 레이어 퍼셉트

private void Initialize() 
{ 
    NETWORK.SetActivationFunction(
    ANN_MLP.AnnMlpActivationFunction.SigmoidSym); 

    NETWORK.SetTrainMethod(ANN_MLP.AnnMlpTrainMethod.Backprop); 

    Matrix<double> layers = new Matrix<double>(new Size(4, 1)); 
    layers[0, 0] = 2; 
    layers[0, 1] = 2; 
    layers[0, 2] = 2; 
    layers[0, 3] = 1; 
    NETWORK.SetLayerSizes(layers); 
} 

private void Train() 
{ 
    // providing data for input 

    Matrix<float> input = new Matrix<float>(4, 2); 
    input[0, 0] = MIN_ACTIVATION_FUNCTION; input[0, 1] = MIN_ACTIVATION_FUNCTION; 
    input[1, 0] = MIN_ACTIVATION_FUNCTION; input[1, 1] = MAX_ACTIVATION_FUNCTION; 
    input[2, 0] = MAX_ACTIVATION_FUNCTION; input[2, 1] = MIN_ACTIVATION_FUNCTION; 
    input[3, 0] = MAX_ACTIVATION_FUNCTION; input[3, 1] = MAX_ACTIVATION_FUNCTION; 

    //providing data for output 
    Matrix<float> output = new Matrix<float>(4, 1); 
    output[0, 0] = MIN_ACTIVATION_FUNCTION; 
    output[1, 0] = MAX_ACTIVATION_FUNCTION; 
    output[2, 0] = MAX_ACTIVATION_FUNCTION; 
    output[3, 0] = MAX_ACTIVATION_FUNCTION; 


    // mixing input and output for training 
    TrainData mixedData = new TrainData(
     input, 
     Emgu.CV.ML.MlEnum.DataLayoutType.RowSample, 
     output); 

    // stop condition = 1 million iterations 
    NETWORK.TermCriteria = new MCvTermCriteria(1000000); 

    // training 
    NETWORK.Train(mixedData); 
} 
MIN_ACTIVATION_FUNCTION

MAX_ACTIVATION_FUNCTION는 각각 -1.7159과 1.7159 (according to OpenCV Documentation)과 동일하다 :

나는 "초기화"방법으로 아래의 "기차"방법을 사용하여 배울 사용 MLP를 만들 수 있습니다.
-0.00734469
: 여기

private void Predict() 
{ 
    Matrix<float> input = new Matrix<float>(1, 2); 
    input[0, 0] = MIN_ACTIVATION_FUNCTION; 
    input[0, 1] = MIN_ACTIVATION_FUNCTION; 

    Matrix<float> output = new Matrix<float>(1, 1); 

    NETWORK.Predict(input, output); 
    MessageBox.Show(output[0, 0].ToString()); 

    ////////////////////////////////////////////// 

    input[0, 0] = MIN_ACTIVATION_FUNCTION; 
    input[0, 1] = MAX_ACTIVATION_FUNCTION; 

    NETWORK.Predict(input, output); 
    MessageBox.Show(output[0, 0].ToString()); 

    ////////////////////////////////////////////// 

    input[0, 0] = MAX_ACTIVATION_FUNCTION; 
    input[0, 1] = MIN_ACTIVATION_FUNCTION; 

    NETWORK.Predict(input, output); 
    MessageBox.Show(output[0, 0].ToString()); 

    //////////////////////////////////////////////// 

    input[0, 0] = MAX_ACTIVATION_FUNCTION; 
    input[0, 1] = MAX_ACTIVATION_FUNCTION; 

    NETWORK.Predict(input, output); 
    MessageBox.Show(output[0, 0].ToString()); 
} 

네트워크의 예상의 샘플입니다 : (당신은 정지 상태에서 내 코드에서 보는 바와 같이)의 1000000 반복 후, 나는 아래와 같은 방법을 예측하여 예측에 내 네트워크를 테스트
-1.7
1.7 012,350,952,993 :

-0.03184918
0.02080269
-0.006674092는이 같은 몇 가지 일이 될 것으로 예상 +1.7
+1.7


내 코드에서 무엇이 잘못 되었습니까?

또한 MIN_ACTIVATION_FUNCTIONMAX_ACTIVATION_FUNCTION 값으로 0, 1을 사용하지만 여전히 좋은 결과는 없습니다.

업데이트 1 : 첫 번째 대답은 나를 참조하기 때문에 (심지어 내 의견을 언급 한 아이디어로 내 코드를 테스트 함) 나를 편집합니다. 이제 predict 메서드를 호출 할 때 NaN이 생깁니다.

+0

아마 여기 게시 더 많은 피드백을 받게됩니다 - http://www.emgu.com/forum/ –

답변

0

새 버전의 EmguCV (Emgu.CV-3.1.0-r16.12)에 따르면이 문제는 3.1.0 버전의 버그였습니다. 이제 Emgu.CV-3.1.0-r16.12으로 수정되었습니다. 이 버전을 다운로드하면 내 네트워크에서 올바른 응답을 얻습니다.

0

데이터를 출력하는 데 오류가있는 것으로 보입니다. input 대신 output 배열을 사용하십시오.

출력 응답이 2D 행렬이어야한다고 생각합니다 (2 열 포함). 마지막 레이어에는 2 개의 출력 뉴런이 있어야합니다. 예를 들어 (1, 0) is class "True"(0, 1) is class "False"과 같은 2 개의 클래스가 있기 때문입니다. 또한 네트워크 아키텍처를 변경하십시오. 논리 연산자 OR은 선형으로 분리 가능합니다. 즉, 단일 퍼 스턴을 사용하여 수행 할 수 있습니다.

+0

감사합니다. 이제 내 문제는 모든 출력은 NaN입니다! 어떻게 해결할 수 있습니까? –

+0

레이어 크기를 먼저 설정 한 다음 활성화 기능을 설정해야합니다. http://stackoverflow.com/questions/36871277/opencv-3-1-ann-predict-returns-nan을 참조하십시오. 다행 당신을 도울! – Didgeridoo

+1

@ Babak.Abad 코드를 실행하여 NaN 결과도 받았습니다. NET Framework 4.5 용 최신 NuGet 패키지 EmguCV v3.1.0.1을 사용했습니다. 또한 Emulator CV 3.x에서 [Wiki] (http://www.emgu.com/wiki/index.php/ANN_MLP_ (Neural_Network) _in_CSharp)의 예제를 실행하려고했지만'response'에 대해 모든 NaN을 가졌습니다. 'network.Predict (...) '를 호출 한 후. Emgu CV에서'ANN_MLP'로 매우 비정상적인 동작입니다, 그것은 버그입니다. C++ (Open CV)를 사용하여 코드를 다시 작성하거나 신경 네트워크 용으로 다른 C# 라이브러리를 사용하십시오. – Didgeridoo