मैं बैक-प्रोपेगेशन के साथ 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 <= p (x) <= 1। पी के न्यूनतम मान के रूप में देखकर 0 था और अधिकतम 15 था मैंने एक नया इनपुट वेक्टर scaledp = p/15 बनाया। –
आपको गतिविधि फ़ंक्शन के रूप में अधिकतम उपयोग नहीं करना चाहिए, क्योंकि आपके त्रुटि फ़ंक्शन को गतिविधि पर परिभाषित किया जाना चाहिए न कि सक्रियण, और अधिकतम गैर-भिन्न है, जिसका अर्थ है कि आप बैक-प्रोप का उपयोग नहीं कर सकते हैं। आपको सॉफ्टमैक्स की आवश्यकता है, नीचे मेरा जवाब देखें। –