EmguCV

2017-04-13 8 views
6

में मल्टी लेयर 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 मिलते हैं।

+0

शायद यहाँ पोस्टिंग अधिक प्रतिक्रिया प्राप्त होगा - http://www.emgu.com/forum/ –

उत्तर

0

EmguCV के नए संस्करण के अनुसार (Emgu.CV-3.1.0-r16.12) समस्या संस्करण 3.1.0 में एक बग अब यह Emgu.CV-3.1.0-r16.12 में तय हो गई है था। इस संस्करण को डाउनलोड करके, मुझे अपने नेटवर्क से सही प्रतिक्रिया मिलती है।

0

ऐसा लगता है आप उत्पादन के लिए उपलब्ध कराने के डेटा में कोई त्रुटि है। input के बजाय output सरणी का उपयोग करें।

मैं (2 कॉलम के साथ) लगता है कि आपके उत्पादन प्रतिक्रियाओं 2 डी-मैट्रिक्स होना चाहिए। अंतिम परत में 2 आउटपुट न्यूरॉन्स होना चाहिए, क्योंकि आपके पास 2 कक्षाएं हैं उदाहरण के लिए (1, 0) is class "True" और (0, 1) is class "False"। अपने नेटवर्क के आर्किटेक्चर को बदलने का भी प्रयास करें। तर्क ऑपरेटर OR रैखिक वियोज्य अर्थात यह एक एकल perceprton का उपयोग किया जा सकता है।

+0

आप अपने लिए एक बहुत धन्यवाद। अब मेरी समस्या है कि सभी आउटपुट NaN हैं! मेरे द्वारा यह कैसे किया जा सकता है? –

+0

पहले लेयर आकार को सेट करना सुनिश्चित करें, फिर सक्रियण फ़ंक्शन। Http://stackoverflow.com/questions/36871277/opencv-3-1-ann-predict-returns-nan देखें। आपकी मदद करके प्रसन्नता हुई! – Didgeridoo

+1

@ बाबाक। अबाड मैंने आपका कोड चलाया और NaN परिणाम भी प्राप्त किए। मैंने .NET Framework 4.5 के लिए नवीनतम NuGet पैकेज EmguCV v3.1.0.1 का उपयोग किया। इसके अलावा, मैं Emgu सीवी 3.x के लिए [विकी] (http://www.emgu.com/wiki/index.php/ANN_MLP_ (Neural_Network) _in_CSharp) से एक उदाहरण भागने की कोशिश की, लेकिन मैं 'response' के लिए सभी NaN था कॉल 'नेटवर्क के बाद। भविष्यवाणी (...) '। इमू सीवी में 'एएनएन_एमएलपी' के साथ यह असामान्य व्यवहार है, ऐसा लगता है कि यह बग है। सी ++ (ओपन सीवी) का उपयोग करके अपने कोड को फिर से लिखने का प्रयास करें या तंत्रिका नेटवर्क के लिए एक और सी # लाइब्रेरी का उपयोग करें। – Didgeridoo

संबंधित मुद्दे