2009-10-14 25 views
18

के साथ अनुमानित कार्य मैं अपने आप को लिखने वाले तंत्रिका नेटवर्क का उपयोग करके साइन() फ़ंक्शन का अनुमान लगाने का प्रयास कर रहा हूं। मैंने पहले से ही एक साधारण ओसीआर समस्या पर अपने तंत्रिका नेटवर्क का परीक्षण किया है और यह काम करता है, लेकिन मुझे साइन() के अनुमान लगाने के लिए इसे लागू करने में परेशानी हो रही है। मेरी समस्या यह है कि प्रशिक्षण के दौरान मेरी त्रुटि बिल्कुल 50% पर अभिसरण होती है, इसलिए मैं अनुमान लगा रहा हूं कि यह पूरी तरह से यादृच्छिक है।तंत्रिका नेटवर्क

मैं इनपुट के लिए एक इनपुट न्यूरॉन (0 से पीआई), और परिणाम के लिए एक आउटपुट न्यूरॉन का उपयोग कर रहा हूं। मेरे पास एक छिपी परत है जिसमें मैं न्यूरॉन्स की संख्या बदल सकता हूं लेकिन मैं वर्तमान में 6-10 के आसपास कोशिश कर रहा हूं।

मुझे लगता है कि समस्या यह है कि मैं सिग्मोइड ट्रांसफर फ़ंक्शन (जो मेरे आवेदन में एक आवश्यकता है) का उपयोग कर रहा है जो केवल 0 और 1 के बीच आउटपुट करता है, जबकि साइन() के लिए आउटपुट -1 और 1 के बीच होता है। इसे ठीक करने का प्रयास करने के लिए मैंने आउटपुट को 2 से गुणा करने की कोशिश की और फिर 1 घटाया, लेकिन इससे समस्या ठीक नहीं हुई। मुझे लगता है कि मुझे यह काम करने के लिए कहीं किसी तरह का रूपांतरण करना है।

कोई भी विचार?

+0

यदि आप एनएन-आधारित अनुमान के शोध कार्यान्वयन को देखने में रुचि रखते हैं, तो मेरा [सर्वेक्षण अनुमानित कंप्यूटिंग पर सर्वेक्षण पत्र] देखें (https://www.academia.edu/20201007/A_Survey_Of_Techniques_for_Approximate_Computing) जो आपके प्रश्न का विस्तार से उत्तर दे सकता है। – user984260

उत्तर

16

रैखिक आउटपुट इकाई का उपयोग करें।

यहाँ एक सरल उदाहरण R उपयोग कर रहा है:

set.seed(1405) 
x <- sort(10*runif(50)) 
y <- sin(x) + 0.2*rnorm(x) 

library(nnet) 
nn <- nnet(x, y, size=6, maxit=40, linout=TRUE) 
plot(x, y) 
plot(sin, 0, 10, add=TRUE) 
x1 <- seq(0, 10, by=0.1) 
lines(x1, predict(nn, data.frame(x=x1)), col="green") 

neural net prediction

+0

रैखिक आउटपुट इकाई द्वारा, क्या आप आउटपुट इकाई के लिए f (net) = net की गणना करना चाहते हैं? क्योंकि मैंने कोशिश की है और अभी भी एक ही समस्या है। – MahlerFive

+0

बिल्कुल, एक रैखिक फ़ंक्शन f (x) = a * x – rcs

+0

मामूली विवरण, लेकिन आपका r-project.org हाइपरलिंक "www" तैयार किए बिना काम नहीं करता है। –

11

जब आप नेटवर्क को प्रशिक्षित, आप रेंज [0,1] के लिए लक्ष्य (पाप समारोह) को सामान्य करना चाहिए, तो आप सिग्मोइड ट्रांसफर फ़ंक्शन रख सकते हैं।

sin(x) in [-1,1] => 0.5*(sin(x)+1) in [0,1] 

Train data: 
    input target target_normalized 
    ------------------------------------ 
    0   0   0.5 
    pi/4  0.70711 0.85355 
    pi/2  1   1 
    ... 

ध्यान दें कि है कि हम प्रशिक्षण से पहले लक्ष्य मैप किया। एक बार जब आप नेटवर्क को प्रशिक्षित और अनुकरण करते हैं, तो आप नेट के आउटपुट को वापस मैप कर सकते हैं। हालांकि 6 के लिए कम पक्ष पर निश्चित रूप से है,

%% input and target 
input = linspace(0,4*pi,200); 
target = sin(input) + 0.2*randn(size(input)); 

% mapping 
[targetMinMax,mapping] = mapminmax(target,0,1); 

%% create network (one hidden layer with 6 nodes) 
net = newfit(input, targetMinMax, [6], {'tansig' 'tansig'}); 
net.trainParam.epochs = 50; 
view(net) 

%% training 
net = init(net);       % init 
[net,tr] = train(net, input, targetMinMax); % train 
output = sim(net, input);     % predict 

%% view prediction 
plot(input, mapminmax('reverse', output, mapping), 'r', 'linewidth',2), hold on 
plot(input, target, 'o') 
plot(input, sin(input), 'g') 
hold off 
legend({'predicted' 'target' 'sin()'}) 

network output

0

कोई कारण नहीं अपने नेटवर्क काम नहीं करना चाहिए नहीं है:


निम्नलिखित वर्णन करने के लिए एक MATLAB कोड है एक साइन लहर अनुमानित। मैं कम से कम 10 शायद 20 भी कोशिश करूँगा।

यदि यह काम नहीं करता है तो मुझे लगता है कि आपको अपने सिस्टम के बारे में अधिक जानकारी देने की आवश्यकता है। यानी सीखने वाले एल्गोरिदम (बैक-प्रोपेगेशन?), सीखने की दर इत्यादि

0

यदि वेनिला ग्रेडियेंट वंश का उपयोग करते हैं तो मुझे वही व्यवहार मिलता है। एक अलग प्रशिक्षण एल्गोरिदम का उपयोग करने का प्रयास करें।

जहां तक ​​जावा ऐपलेट का संबंध है, मैंने कुछ दिलचस्प देखा है: अगर मैं "द्विध्रुवीय सिग्मोइड" का उपयोग करता हूं तो यह अभिसरण करता है और मैं कुछ गैर-यादृच्छिक भारों से शुरू होता हूं (जैसे कि क्वाड्रैटिक का उपयोग करके पिछले प्रशिक्षण के परिणाम समारोह)।

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