2017-04-13 6 views
6

Ich versuche, Multi-Layer Perceptrons (MLP) Neuronale Netze mit EmguCV 3.1 (ein Punkt NET-Wrapper für OpenCV-Bibliothek) in C# (Windows Form) zu implementieren. Um mit dieser Bibliothek zu üben, beschließe ich, OR Operation mit MLP zu implementieren.Multi-Layer Perceptrons in EmguCV

Ich schaffe MLP "Initialisieren" Methode und lernen sie, wie unten "Train" Methode:

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); 
} 

Wo MIN_ACTIVATION_FUNCTION und MAX_ACTIVATION_FUNCTION gleich sind -1,7159 und 1,7159, bzw. (according to OpenCV Documentation). wie unten Nach 1000000 Iterationen (wie Sie in meinem Code in Stop-Zustand sehen), teste ich mein Netzwerk für die Vorhersage Predict Methode:

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()); 
} 

Hier ist ein Beispiel von dem, was NETWORK sagt:
-0,00734469
-0,03184918
0,02080269
-0,006674092

ich erwarte, dass etwas, was so aussehen:
-1,7
+1,7
+1,7
+1,7


Was ist falsch unter meinen Codes?

Beachten Sie, dass ich auch 0, 1 für MIN_ACTIVATION_FUNCTION und MAX_ACTIVATION_FUNCTION Werte verwende, aber ich habe immer noch keine guten Ergebnisse.

Update 1: Ich bearbeite meine Codes als erste Antwort verweist mich (auch ich teste meinen Code mit der Idee in den Kommentaren verwiesen). Jetzt bekomme ich NaN, wenn Anruf predict Methode.

+0

vielleicht Beitrag hier erhalten mehr Feedback - http://www.emgu.com/forum/ –

Antwort

0

Laut der neuen Version von EmguCV (Emgu.CV-3.1.0-r16.12) war das Problem ein Fehler in der Version 3.1.0 Jetzt ist es in Emgu.CV-3.1.0-r16.12 behoben. Durch das Herunterladen dieser Version erhalte ich korrekte Antworten von meinem Netzwerk.

0

Es scheint, dass Sie einen Fehler bei der Bereitstellung von Daten für die Ausgabe haben. Verwenden Sie output Array anstelle von input.

Ich denke, Ihre Ausgabe Antworten sollten 2D-Matrix (mit 2 Spalten) sein. Die letzte Schicht sollte 2 Ausgabe-Neuronen haben, weil Sie 2 Klassen haben, zum Beispiel (1, 0) is class "True" und . Versuchen Sie auch, die Architektur Ihres Netzwerks zu ändern. Der logische Operator OR ist linear trennbar, d. H. Er kann unter Verwendung eines einzelnen Percepton ausgeführt werden.

+0

Vielen Dank für Ihre. Jetzt ist mein Problem, alle Ausgänge sind NaN! Wie kann ich es reparieren? –

+0

Stellen Sie sicher, zuerst die Layergröße und dann die Aktivierungsfunktion einzustellen. Siehe http://stackoverflow.com/questions/36871277/opencv-3-1-ann-predic-returns-nan. Froh dir zu helfen! – Didgeridoo

+1

@ Babak.Abad Ich lief Ihren Code und erhielt auch NaN Ergebnisse. Ich habe das neueste NuGet-Paket EmguCV v3.1.0.1 für .NET Framework 4.5 verwendet. Auch ich habe versucht, ein Beispiel von [Wiki] (http://www.emgu.com/wiki/index.php/ANN_MLP_ (Neural_Network) _in_CSharp) für Emgu CV 3.x zu laufen, aber ich hatte alle NaN für "Antwort" nach dem Aufruf 'network.Predict (...)'. Es ist ein sehr abnormales Verhalten mit 'ANN_MLP' in Emgu CV, es scheint ein Bug zu sein. Versuchen Sie, Ihren Code mit C++ (Open CV) oder mit einer anderen C# -Bibliothek für neuronale Netzwerke neu zu schreiben. – Didgeridoo