Unable to approximate the sine function using a neural network

后端 未结 4 1568
后悔当初
后悔当初 2020-11-30 02:58

I am trying to approximate the sine() function using a neural network I wrote myself. I have tested my neural network on a simple OCR problem already and it worked, but I am

相关标签:
4条回答
  • 2020-11-30 03:07

    I get the same behavior if use vanilla gradient descent. Try using a different training algorithm.

    As far as the Java applet is concerned, I did notice something interesting: it does converge if I use a "bipolar sigmoid" and I start with some non-random weights (such as results from a previous training using a Quadratic function).

    0 讨论(0)
  • 2020-11-30 03:09

    There is no reason your network shouldn't work, although 6 is definitely on the low side for approximating a sine wave. I'd try at least 10 maybe even 20.

    If that doesn't work then I think you need to give more detail about your system. i.e. the learning algorithm (back-propagation?), the learning rate etc.

    0 讨论(0)
  • 2020-11-30 03:17

    When you train the network, you should normalize the target (the sin function) to the range [0,1], then you can keep the sigmoid transfer function.

    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
        ...
    

    Note that that we mapped the target before training. Once you train and simulate the network, you can map back the output of the net.


    The following is a MATLAB code to illustrate:

    %% 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 讨论(0)
  • 2020-11-30 03:23

    Use a linear output unit.

    Here is a simple example using 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 讨论(0)
提交回复
热议问题