Я создаю MLP, используя метод «Инициализировать» и изучать его, используя метод «поезда», как ниже: < /p>
Код: Выделить всё
private void Initialize()
{
NETWORK.SetActivationFunction(
ANN_MLP.AnnMlpActivationFunction.SigmoidSym);
NETWORK.SetTrainMethod(ANN_MLP.AnnMlpTrainMethod.Backprop);
Matrix layers = new Matrix(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 input = new Matrix(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 output = new Matrix(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);
}
Код: Выделить всё
private void Predict()
{
Matrix input = new Matrix(1, 2);
input[0, 0] = MIN_ACTIVATION_FUNCTION;
input[0, 1] = MIN_ACTIVATION_FUNCTION;
Matrix output = new Matrix(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());
}
< /code>
Вот образец того, что предсказывает сеть:
-0.00734469
-0.03184918
0.02080269
-0.006674092,020269
-0.006674092, /> Я ожидаю, что будет что-то вроде следующего:
-1.7
+1.7
+1.7
+1.7
Что не так среди моих кодов? Min_activation_function < /code> и max_activation_function < /code> Значения, но я все еще не получаю хороших результатов. < /P>
Обновление 1:
Я редактирую свои коды как первый ответ Me Refers Me (даже я тестирую свой код с идеей, ссылаемся в комментариях). Теперь я получаю NAN Подробнее здесь: https://stackoverflow.com/questions/433 ... -in-emgucv