में मल्टी लेयर perceptrons मैं मल्टी लेयर perceptrons (MLP) सी # (विंडोज फार्म) में EmguCV 3.1 (OpenCV पुस्तकालय के लिए डॉट नेट आवरण) का उपयोग तंत्रिका नेटवर्क को लागू करने की कोशिश कर रहा हूँ। इस पुस्तकालय के साथ अभ्यास करने के लिए मैं एमएलपी का उपयोग कर 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 क्रमश: (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 पुनरावृत्तियों के बाद (जैसा कि आप बंद हालत में मेरी कोड में देखें), मैं अपने नेटवर्क पूर्वानुमान के लिए नीचे के रूप में विधि भविष्यवाणी मदद से इसका परीक्षण -0,03184918
0,02080269
-0,006674092
मैं उम्मीद इस तरह की कुछ बात हो:
-1,7
+1,7
+1.7
+1.7
मेरे कोड में क्या गलत है?
ध्यान दें कि मैं MIN_ACTIVATION_FUNCTION
और MAX_ACTIVATION_FUNCTION
मानों के लिए 0, 1 का भी उपयोग करता हूं लेकिन मुझे अभी भी कोई अच्छा परिणाम नहीं है।
अद्यतन 1: मैं अपने कोड संपादित करता हूं क्योंकि पहला जवाब मुझे संदर्भित करता है (यहां तक कि मैं टिप्पणियों में संदर्भित विचार के साथ अपने कोड का परीक्षण करता हूं)। predict
विधि पर कॉल करते समय अब मुझे NaN
मिलते हैं।
शायद यहाँ पोस्टिंग अधिक प्रतिक्रिया प्राप्त होगा - http://www.emgu.com/forum/ –