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.
vielleicht Beitrag hier erhalten mehr Feedback - http://www.emgu.com/forum/ –