Próbuję wprowadzić sieci neuronowe Multi-Layer Perceptrons (MLP) przy użyciu EmguCV 3.1 (opakowanie NET NET dla biblioteki OpenCV) w C# (Windows Form). Aby przećwiczyć tę bibliotekę, postanowiłem zaimplementować operację OR
przy użyciu MLP.Perceptrony wielowarstwowe w EmguCV
tworzę MLP używając "Initialize" Sposób i nauczyć się go za pomocą metody "Pociąg", jak poniżej:
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);
}
Gdzie MIN_ACTIVATION_FUNCTION
i MAX_ACTIVATION_FUNCTION
są równe i 1.7159 -1.7159, odpowiednio (according to OpenCV Documentation). Po 1000000 iteracjach (jak widać w moim kodu w stanie zatrzymania), przetestować sieć do przewidywania za pomocą Przewidzieć metodę jak poniżej:
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());
}
Oto próbka tego, co przewiduje sieci:
-0,00734469
-0,03184918
0,02080269
-0,006674092
Spodziewam się niektóre rzeczy tak:
-1,7
+1,7
+1.7
+1.7
Co jest nie tak wśród moich kodów?
Należy pamiętać, że używam również wartości 0, 1 dla wartości MIN_ACTIVATION_FUNCTION
i MAX_ACTIVATION_FUNCTION
, ale nadal nie mam żadnych dobrych wyników.
Aktualizacja 1: Edytuję moje kody, ponieważ pierwsza odpowiedź odnosi się do mnie (nawet testuję swój kod z pomysłem wymienionym w komentarzach). Teraz otrzymuję NaN
, gdy zadzwonię pod numer predict
.
może zamieścić tutaj otrzymasz więcej informacji zwrotnych - http://www.emgu.com/forum/ –