【问题标题】:Unable to approximate the sine function using a neural network无法使用神经网络逼近正弦函数
【发布时间】:2010-12-06 14:41:34
【问题描述】:

我正在尝试使用我自己编写的神经网络来近似 sine() 函数。我已经在一个简单的 OCR 问题上测试了我的神经网络并且它有效,但是我无法将它应用于近似正弦()。我的问题是,在训练过程中我的误差正好收敛到 50%,所以我猜它是完全随机的。

我使用一个输入神经元作为输入(0 到 PI),一个输出神经元作为结果。我有一个隐藏层,我可以在其中改变神经元的数量,但我目前正在尝试 6-10 左右。

我感觉问题是因为我使用了 sigmoid 传递函数(这是我的应用程序中的要求),它只输出 0 和 1 之间,而 sine() 的输出在 -1 和 1 之间。尝试纠正这个我尝试将输出乘以 2 然后减去 1,但这并没有解决问题。我想我必须在某个地方进行某种转换才能完成这项工作。

有什么想法吗?

【问题讨论】:

标签: machine-learning neural-network approximation


【解决方案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")

【讨论】:

  • 线性输出单位是指为输出单位计算f(net) = net吗?因为我已经尝试过了,但仍然遇到同样的问题。
  • 没错,一个线性函数f(x)=a*x
  • 次要细节,但如果不添加“www”,您的 r-project.org 超链接将无法使用。
  • 为什么一定要使用线性输出单元?我对隐藏层和输出层都使用了 sigmoid,结果仍然很好。
  • 图片链接已损坏。可以再上传一次吗?
【解决方案2】:

在训练网络时,应该将目标(sin函数)归一化到[0,1]范围内,然后可以保留sigmoid传递函数。

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

【讨论】:

    【解决方案3】:

    您的网络没有理由不工作,尽管 6 对于近似正弦波来说绝对偏低。我会尝试至少 10 个,甚至 20 个。

    如果这不起作用,那么我认为您需要提供有关系统的更多详细信息。即学习算法(反向传播?),学习率等。

    【讨论】:

      【解决方案4】:

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

      就 Java 小程序而言,我确实注意到了一些有趣的事情:如果我使用“双极 sigmoid”并且我从一些非随机权重开始(例如之前使用二次函数训练的结果),它确实会收敛)。

      【讨论】:

        猜你喜欢
        • 2012-12-03
        • 2018-09-10
        • 2017-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        • 2017-04-01
        相关资源
        最近更新 更多