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_FUNCTION
및 MAX_ACTIVATION_FUNCTION
값으로 0, 1을 사용하지만 여전히 좋은 결과는 없습니다.
업데이트 1 : 첫 번째 대답은 나를 참조하기 때문에 (심지어 내 의견을 언급 한 아이디어로 내 코드를 테스트 함) 나를 편집합니다. 이제 predict
메서드를 호출 할 때 NaN
이 생깁니다.
아마 여기 게시 더 많은 피드백을 받게됩니다 - http://www.emgu.com/forum/ –