2009-10-14 5 views
18

나는 자신을 쓴 신경망을 사용하여 sine() 함수를 근사하려고한다. 나는 단순한 OCR 문제에 신경 네트워크를 이미 테스트했고 효과가 있었지만 근사치 sine()에 적용하는 데 문제가 있습니다. 내 문제는 훈련 도중 내 오차가 정확히 50 %에 수렴한다는 것이다. 그래서 나는 그것이 완전히 무작위라고 생각한다.신경망을 가진 근사 함수

입력 (0에서 PI)에 하나의 입력 뉴런과 결과에 대해 하나의 출력 뉴런을 사용하고 있습니다. 나는 뉴런의 수를 다양하게 할 수있는 하나의 숨겨진 레이어를 가지고 있지만 현재 약 6-10을 시도하고 있습니다.

sine()의 출력이 -1과 1 사이 인 반면 0과 1 사이에서만 출력되는 sigmoid 전달 함수 (내 응용 프로그램의 요구 사항)를 사용하고 있기 때문에 문제가 있다는 느낌이 들었습니다. 이 문제를 해결하기 위해 출력을 2로 곱한 다음 1을 뺀 것을 시도했지만 문제가 해결되지 않았습니다. 나는이 일을하기 위해 어딘가에서 어떤 종류의 변환을해야한다고 생각하고있다.

아이디어가 있으십니까?

+0

NN 기반의 근사치에 대한 연구 구현에 관심이있는 경우 내 [근사 컴퓨팅에 대한 조사 보고서] (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

바닐라 그라디언트 디센트를 사용하는 경우 동일한 동작이 발생합니다. 다른 교육 알고리즘을 사용해보십시오.

Java 애플릿에 관한 한 흥미로운 점을 들었습니다. "양극성 Sigmoid"를 사용하고 임의의 비가 중 가중치로 시작하면 컨버전스가 발생합니다 (예 : 2 차 기능).