无法使用近似神经网络的正弦函数(Unable to approximate the sine fun

2019-07-27 10:34发布

我想用我自己写的神经网络来近似正弦波()函数。 我过我的一个简单的OCR问题的神经网络已经和它的工作,但我有应用它来近似正弦波麻烦()。 我的问题是,训练中我的错误就整整50%收敛,所以我猜它是完全随机的。

我使用用于输入(0至PI)一个输入神经元,并为一个结果输出神经元。 我有一个隐藏层中,我可以改变神经元的数目,但我目前正试图围绕6-10。

我有一种感觉这个问题是因为我使用的是S型传递函数(这是我的应用程序的要求),其中只有0和1之间的输出,而输出正弦()是-1和1之间,以尝试解决这一点,我试图通过2的输出相乘,然后减去1,但这并没有解决问题。 我想我必须做一些转换的地方,使这项工作。

有任何想法吗?

Answer 1:

使用线性输出单元

下面是使用一个简单的例子- [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")



Answer 2:

当你训练网络,你应该正常化的目标(正弦函数)在范围[0,1],那么你就可以保持S型传递函数。

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

需要注意的是,我们训练映射目标。 一旦你训练和模拟网络,可以映射回净输出。


下面是一个MATLAB代码来说明:

%% 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()'})



Answer 3:

没有理由您的网络不应该工作,虽然6绝对是偏低的近似正弦波。 我想尝试至少10甚至20。

如果不工作,那么我认为你需要给你的系统的更多细节。 即,学习算法(反向传播?),学习率等



Answer 4:

我得到,如果使用香草梯度下降相同的行为。 尝试使用不同的训练算法。

至于Java小程序而言,我注意到一些有趣的事情:它不收敛,如果我使用一个“双极乙状结肠”和我(利用二次函数,如从以前的训练效果)开始与一些非随机权。



文章来源: Unable to approximate the sine function using a neural network