2009-08-17 25 views
5

मैं बैक-प्रोपेगेशन के साथ 2 परत तंत्रिका नेटवर्क बनाने पर काम कर रहा हूं। एनएन को 20001x17 वेक्टर से अपना डेटा प्राप्त करना होता है जिसमें प्रत्येक पंक्ति में निम्नलिखित जानकारी होती है:मैटलैब - तंत्रिका नेटवर्क प्रशिक्षण

- पहले 16 कोशिकाओं में 0 से 15 तक के पूर्णांक होते हैं जो यह निर्धारित करने में सहायता के लिए चर के रूप में कार्य करते हैं कि 26 अक्षरों में से कौन सा उन चरों को देखते समय वर्णमाला का अर्थ व्यक्त करना है। उदाहरण के लिए 16 मानों की श्रृंखला निम्नानुसार वर्ण ए का प्रतिनिधित्व करने के लिए है: [2 8 4 5 2 7 5 3 1 6 0 8 2 7 2 7]।

- 17 वें सेल में वर्णमाला के अक्षर का प्रतिनिधित्व करने वाले 1 से 26 तक की संख्या होती है। 1 ए के लिए खड़ा है, बी के लिए 2 खड़ा है।

एनएन की आउटपुट परत में 26 आउटपुट होते हैं। हर बार एनएन को ऊपर वर्णित एक इनपुट जैसे खिलाया जाता है, यह 1x26 वेक्टर को शून्य में युक्त आउटपुट को आउटपुट करना होता है, लेकिन एक सेल जो उस पत्र से मेल खाता है जो इनपुट मानों का प्रतिनिधित्व करने के लिए किया गया था। उदाहरण के लिए आउटपुट [1 0 0 ... 0] अक्षर ए होगा, जबकि [0 0 0 ... 1] पत्र होगा Z.

कुछ चीजें जो कोड प्रस्तुत करने से पहले महत्वपूर्ण हैं: I

%%%%%%%% 
%Start of code% 
%%%%%%%% 

% 
%Initialize the input and target vectors 
% 
p = zeros(16,20001); 
t = zeros(26,20001); 

% 
%Fill the input and training vectors from the dataset provided 
% 
for i=2:20001 
    for k=1:16 
     p(k,i-1) = data(i,k); 
    end 
    t(data(i,17),i-1) = 1; 
end 

net = newff(minmax(p),[21 26],{'logsig' 'logsig'},'traingdm'); 

y1 = sim(net,p); 

net.trainParam.epochs = 200; 
net.trainParam.show = 1; 
net.trainParam.goal = 0.1; 
net.trainParam.lr = 0.8; 
net.trainParam.mc = 0.2; 
net.divideFcn = 'dividerand'; 
net.divideParam.trainRatio = 0.7; 
net.divideParam.testRatio = 0.2; 
net.divideParam.valRatio = 0.1; 

%[pn,ps] = mapminmax(p); 
%[tn,ts] = mapminmax(t); 

net = init(net); 
[net,tr] = train(net,p,t); 

y2 = sim(net,pn); 

%%%%%%%% 
%End of code% 
%%%%%%%% 

अब मेरी समस्या का: ऊपर अवधारणा मैं निम्नलिखित matlab कोड लिखा था बनाने के लिए कोशिश कर रहा है 21.

पर traingdm समारोह और छिपी परत संख्या तय हो गई है (अब के लिए) का उपयोग करने की जरूरत है मैं मेरे आउटपुट को वर्णित करना चाहते हैं, अर्थात् वाई 2 वेक्टर के प्रत्येक कॉलम उदाहरण के लिए एक पत्र का प्रतिनिधित्व होना चाहिए। मेरा कोड ऐसा नहीं करता है। इसके बजाए यह परिणाम उत्पन्न हुए जो 0 और 1 के बीच काफी भिन्न होते हैं, 0.1 से 0.9 के मान।

मेरा प्रश्न है: क्या कुछ रूपांतरण है जो मुझे करने की ज़रूरत है, मैं नहीं हूं? मतलब, क्या मुझे अपने इनपुट और/या आउटपुट डेटा को एक रूप में रूपांतरित करना है जिसके द्वारा मैं वास्तव में देख सकता हूं कि मेरा एनएन सही ढंग से सीख रहा है या नहीं?

किसी भी इनपुट की सराहना की जाएगी।

उत्तर

2

यह सामान्य है। आपकी आउटपुट परत लॉग-सिग्मोइड ट्रांसफर फ़ंक्शन का उपयोग कर रही है, और यह आपको 0 और 1.

के बीच हमेशा कुछ इंटरमीडिएट आउटपुट देगी जो आप आमतौर पर सबसे अधिक मूल्य के साथ आउटपुट की तलाश करेंगे - दूसरे में शब्द, सबसे संभावित चरित्र।

इसका मतलब यह होगा कि, y2 में प्रत्येक कॉलम के लिए, आप उस पंक्ति की अनुक्रमणिका की तलाश कर रहे हैं जिसमें उस पंक्ति में सबसे बड़ा मूल्य है।

[dummy, I]=max(y2); 

I तो प्रत्येक पंक्ति में सबसे बड़ा मान की अनुक्रमित युक्त एक वेक्टर है: आप यह कार्य की गणना कर सकते हैं।

+0

मार्टिन, प्रतिक्रिया के लिए धन्यवाद। अधिकतम (वाई 2) का उपयोग करके मैं अब कम से कम कुछ जानकारी प्राप्त कर सकता हूं कि पत्रों की पहचान करने के लिए नेटवर्क कितनी बार सही था। मैंने नेटवर्क को खिलाने से पहले क्या किया था, जो डेटा मैंने किया है, वह इसे स्केल कर रहा है ताकि 0 <= p (x) <= 1। पी के न्यूनतम मान के रूप में देखकर 0 था और अधिकतम 15 था मैंने एक नया इनपुट वेक्टर scaledp = p/15 बनाया। –

+0

आपको गतिविधि फ़ंक्शन के रूप में अधिकतम उपयोग नहीं करना चाहिए, क्योंकि आपके त्रुटि फ़ंक्शन को गतिविधि पर परिभाषित किया जाना चाहिए न कि सक्रियण, और अधिकतम गैर-भिन्न है, जिसका अर्थ है कि आप बैक-प्रोप का उपयोग नहीं कर सकते हैं। आपको सॉफ्टमैक्स की आवश्यकता है, नीचे मेरा जवाब देखें। –

1

आप प्रत्येक इनपुट 26 वर्णमाला पात्रों में से एक होने के लिए एक निर्गम संभावना वितरण के रूप में y2 के बारे में सोच सकते हैं उदाहरण के लिए यदि y2 में से एक स्तंभ का कहना है:

.2 
.5 
.15 
.15 

तो इसकी 50% संभावना कि यह चरित्र बी है (अगर हम केवल 4 संभावित आउटपुट मानते हैं)।



== REMARK ==

एनएन के उत्पादन परत 26 outputs के होते हैं। हर बार जब एनएन तंग आ गया है ऊपर वर्णित एक यह उत्पादन चाहिए था जैसा एक इनपुट एक 1x26 वेक्टर सभी में शून्य लेकिन एक सेल कि पत्र कि इनपुट मानों के लिए बने थे प्रतिनिधित्व करने के लिए मेल खाती है युक्त। उदाहरण के लिए उत्पादन [1 0 0 ... 0] पत्र ए, होगा जबकि [0 0 0 ... 1] पत्र जेड

यह लक्ष्य मान का उपयोग कर से बचने के लिए बेहतर है होगा नेटवर्क के आउटपुट को एन्कोड करने के लिए 0,1 का।
0 और 1 का लक्ष्य मूल्यों से बचने के लिए कारण यह है कि 'logsig' अवग्रह हस्तांतरण समारोह परिमित भार को देखते हुए इन उत्पादन मूल्यों का उत्पादन नहीं कर सकते हैं। यदि आप नेटवर्क को 0 और 1 के लक्ष्य मानों को फिट करने के लिए प्रशिक्षित करने का प्रयास करते हैं, तो ढाल वंश वजन के बिना वजन बढ़ाने के लिए मजबूर करेगा।
तो बजाय 0 और 1 मूल्यों, 0.04 और उदाहरण के लिए 0.9 के मूल्यों का उपयोग कर, ताकि [0.9,0.04, ..., 0.04] पत्र एक के लिए लक्ष्य उत्पादन वेक्टर है की कोशिश करो।


संदर्भ:
थॉमस एम मिशेल, मशीन लर्निंग, मैकग्रा-हिल उच्च शिक्षा, 1997, p114-115

+0

मुझे नहीं लगता कि यह सही है। आउटपुट वेक्टर के प्रत्येक तत्व में 0.00 और 1.00 के बीच भिन्नता होगी, लेकिन किसी भी कॉलम (या उस मामले के लिए उस कॉलम में कोई भी तत्व) का योग वास्तव में प्रतिशत का प्रतिनिधित्व नहीं करेगा। –

+0

आप इसे हमेशा अपने आप सामान्य कर सकते हैं: y2Normalized = y2 ./ repmat (sum (y2), 26, 1) – Amro

+0

वैकल्पिक रूप से आप y2 में उच्चतम मान और दूसरे उच्चतम मूल्य के बीच अंतर का उपयोग कर सकते हैं भविष्यवाणी। – Amro

1
  1. उत्पादन परत में उपयोग hardlin fcn
    1. उपयोग trainlm या trainrp नेटवर्क प्रशिक्षण के लिए।
    2. अपने नेटवर्क को जानने के लिए, लूप और एक शर्त का उपयोग करें जो आउटपुट और लक्ष्य की तुलना करें। जब यह सबसे अच्छा उपयोग होता है, तो लर्निंग लूप से बाहर निकलने के लिए ब्रेक करें।
    3. प्री-प्रोसेसिंग डेटा सेट के लिए mapminmax के बजाय एक और तरीका का उपयोग करें।
0

अगर यह एक वास्तविक जवाब है या नहीं का गठन किया मैं नहीं जानता: लेकिन यहाँ कुछ टिप्पणी कर रहे हैं।

  • मुझे आपकी कोडिंग योजना नहीं समझती है। संख्याओं के सेट के रूप में 'ए' का प्रतिनिधित्व कैसे किया जाता है? ऐसा लगता है कि आप कोड विशिष्ट मूल्यों के लिए मनमानी संख्याओं का उपयोग करने के काफी आम जाल में गिर रहे हैं। ऐसा मत करें: उदाहरण के लिए यदि 'ए' 1 है, 'बी' 2 है और 'सी' 3 है, तो आपके कोडिंग ने स्पष्ट रूप से कहा है कि 'ए' 'सी' से अधिक 'बी' जैसा है (क्योंकि नेटवर्क में वास्तविक मूल्य इनपुट सामान्य गुण हैं)। ऐसा करने का तरीका यह है कि प्रत्येक पत्र को 26 बाइनरी मूल्यवान इनपुट के रूप में दर्शाया जाए, जहां केवल एक ही सक्रिय है, पत्र का प्रतिनिधित्व करता है।
  • आपका आउटपुट सही हैं, उत्पादन परत पर सक्रियण कभी या तो 0 या 1, लेकिन वास्तविक संख्या नहीं होगा। आप अधिकतम अपने गतिविधि फ़ंक्शन के रूप में अधिकतम ले सकते हैं, लेकिन यह समस्याग्रस्त है क्योंकि यह भिन्न नहीं है, इसलिए आप बैक-प्रोप का उपयोग नहीं कर सकते हैं। क्या करना चाहिए, जोड़ी softmax function साथ आउटपुट है ताकि उनके योग से एक है।यदि आप चाहें तो इनपुट के बाद आप आउटपुट को सशर्त संभावनाओं के रूप में देख सकते हैं। जबकि नेटवर्क स्पष्ट रूप से संभाव्य नहीं है, सही गतिविधि और सक्रियण फ़ंक्शंस एक लॉग-रैखिक मॉडल (संभावित रूप से छिपी हुई परत से संबंधित गुप्त चर के साथ) में संरचना में समान होगा, और लोग इसे हर समय करते हैं ।

David Mackay's textbook देखें तंत्रिका जाल के अच्छे परिचय के लिए जो संभाव्य कनेक्शन को स्पष्ट कर देगा। this paper from Geoff Hinton's group पर एक नज़र डालें जो सही प्रतिनिधित्व और सक्रियण/गतिविधि कार्यों पर विवरण के संदर्भ के लिए अगले वर्ण की भविष्यवाणी करने के कार्य का वर्णन करता है (हालांकि उनकी विधि सावधान रहें और गैर-तुच्छ है और एक अलग प्रशिक्षण विधि के साथ आवर्ती नेट का उपयोग करता है)।

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